aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNorman Wilson <norman@teach.cs.toronto.edu>2024-08-12 14:16:30 -0400
committerBernd Schubert <bernd.schubert@fastmail.fm>2024-08-21 23:58:25 +0200
commitc9bf7d3e20ec5c86dd590f695b92e65142491d0e (patch)
treecc59f1349331126ad505d3ae573f4bf0e4242d7e
parent0750b4a194019c991d1c8a7f5e59fb5f4be50e3c (diff)
downloadlibfuse-c9bf7d3e20ec5c86dd590f695b92e65142491d0e.tar.gz
Rearrange util/fusermount.c umount_fuse_locked() so that
umount2 is called with privs dropped, not raised. This works around a clash with NFS permissions: if FUSE mounted on NFS client directory with root_squash in effect, and some directory in the path leading to the mount point denies permissions to others, umount2 will fail because userid 0 cannot search it. Since drop_privs merely sets the file- system user- and group-ID without changing the CAP_SYS_ADMIN capability needed to unmount a file system (which fusermount has because it is set-user-ID root), umount2 works fine.
-rw-r--r--util/fusermount.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/util/fusermount.c b/util/fusermount.c
index e40c457..f37c616 100644
--- a/util/fusermount.c
+++ b/util/fusermount.c
@@ -523,11 +523,13 @@ static int unmount_fuse_locked(const char *mnt, int quiet, int lazy)
drop_privs();
res = chdir_to_parent(copy, &last);
- restore_privs();
- if (res == -1)
+ if (res == -1) {
+ restore_privs();
goto out;
+ }
res = umount2(last, umount_flags);
+ restore_privs();
if (res == -1 && !quiet) {
fprintf(stderr, "%s: failed to unmount %s: %s\n",
progname, mnt, strerror(errno));