From 897340d29d918fa2015f293284a5f408c415dccc Mon Sep 17 00:00:00 2001
From: Jeroen Oortwijn <oortwijn@gmail.com>
Date: Sat, 31 Mar 2012 21:14:19 +0200
Subject: [PATCH] Allow non-root to mount BFS partition with bfs_fuse
* Most FUSE options are only allowed for root, so don't add these options
when user is not root.
* Fixes ticket #8254.
---
src/tools/fs_shell/fuse.cpp | 57 +++++++++++++++++++++++++------------------
1 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/src/tools/fs_shell/fuse.cpp b/src/tools/fs_shell/fuse.cpp
index 6ccd69a..37841f3 100644
a
|
b
|
|
9 | 9 | #include <stdio.h> |
10 | 10 | #include <stdlib.h> |
11 | 11 | #include <syslog.h> |
| 12 | #include <unistd.h> |
12 | 13 | |
13 | 14 | #include "fssh.h" |
14 | 15 | |
… |
… |
fssh_fuse_session(const char* device, const char* mntPoint, const char* fsName,
|
484 | 485 | if (ret != 0) |
485 | 486 | return ret; |
486 | 487 | |
487 | | char* fuseOptions = NULL; |
| 488 | if (getuid() == 0 && geteuid() == 0 && getgid() == 0 && getegid() == 0) { |
| 489 | // only add FUSE options when user is root |
488 | 490 | |
489 | | // default FUSE options |
490 | | char* fsNameOption = NULL; |
491 | | if (fuse_opt_add_opt(&fuseOptions, "allow_other") < 0 |
492 | | || asprintf(&fsNameOption, "fsname=%s", device) < 0 |
493 | | || fuse_opt_add_opt(&fuseOptions, fsNameOption) < 0) { |
494 | | unmount_volume(device, mntPoint); |
495 | | return 1; |
496 | | } |
| 491 | char* fuseOptions = NULL; |
497 | 492 | |
498 | | struct stat sbuf; |
499 | | if ((stat(device, &sbuf) == 0) && S_ISBLK(sbuf.st_mode)) { |
500 | | int blkSize = 512; |
501 | | fssh_dev_t volumeID = get_volume_id(); |
502 | | if (volumeID >= 0) { |
503 | | fssh_fs_info info; |
504 | | if (_kern_read_fs_info(volumeID, &info) == FSSH_B_OK) |
505 | | blkSize = info.block_size; |
| 493 | // default FUSE options |
| 494 | char* fsNameOption = NULL; |
| 495 | if (fuse_opt_add_opt(&fuseOptions, "allow_other") < 0 |
| 496 | || asprintf(&fsNameOption, "fsname=%s", device) < 0 |
| 497 | || fuse_opt_add_opt(&fuseOptions, fsNameOption) < 0) { |
| 498 | unmount_volume(device, mntPoint); |
| 499 | return 1; |
| 500 | } |
| 501 | |
| 502 | struct stat sbuf; |
| 503 | if ((stat(device, &sbuf) == 0) && S_ISBLK(sbuf.st_mode)) { |
| 504 | int blkSize = 512; |
| 505 | fssh_dev_t volumeID = get_volume_id(); |
| 506 | if (volumeID >= 0) { |
| 507 | fssh_fs_info info; |
| 508 | if (_kern_read_fs_info(volumeID, &info) == FSSH_B_OK) |
| 509 | blkSize = info.block_size; |
| 510 | } |
| 511 | |
| 512 | char* blkSizeOption = NULL; |
| 513 | if (fuse_opt_add_opt(&fuseOptions, "blkdev") < 0 |
| 514 | || asprintf(&blkSizeOption, "blksize=%i", blkSize) < 0 |
| 515 | || fuse_opt_add_opt(&fuseOptions, blkSizeOption) < 0) { |
| 516 | unmount_volume(device, mntPoint); |
| 517 | return 1; |
| 518 | } |
506 | 519 | } |
507 | 520 | |
508 | | char* blkSizeOption = NULL; |
509 | | if (fuse_opt_add_opt(&fuseOptions, "blkdev") < 0 |
510 | | || asprintf(&blkSizeOption, "blksize=%i", blkSize) < 0 |
511 | | || fuse_opt_add_opt(&fuseOptions, blkSizeOption) < 0) { |
| 521 | if (fuse_opt_add_arg(&fuseArgs, "-o") < 0 |
| 522 | || fuse_opt_add_arg(&fuseArgs, fuseOptions) < 0) { |
512 | 523 | unmount_volume(device, mntPoint); |
513 | 524 | return 1; |
514 | 525 | } |
515 | 526 | } |
516 | 527 | |
517 | 528 | // Run the fuse_main() loop. |
518 | | if (fuse_opt_add_arg(&fuseArgs, "-s") < 0 |
519 | | || fuse_opt_add_arg(&fuseArgs, "-o") < 0 |
520 | | || fuse_opt_add_arg(&fuseArgs, fuseOptions) < 0) { |
| 529 | if (fuse_opt_add_arg(&fuseArgs, "-s") < 0) { |
521 | 530 | unmount_volume(device, mntPoint); |
522 | 531 | return 1; |
523 | 532 | } |