Skip to content

Commit

Permalink
libmount: (fuse) follow only user_id= on umount
Browse files Browse the repository at this point in the history
The option user= is already handled by evaluate_permissions() and by
classic mount and umount usermount support. It seems we do not need
to duplicate support for user= in is_fuse_usermount().

The option user_id= is fuse specific and it's maintained by
libfuse/kernel in /proc/self/mountinfo. This is feature we need to
support in umount(8).

Addresses: #705
Signed-off-by: Karel Zak <kzak@redhat.com>
  • Loading branch information
karelzak committed Nov 30, 2018
1 parent 5fea669 commit df61216
Showing 1 changed file with 8 additions and 27 deletions.
35 changes: 8 additions & 27 deletions libmount/src/context_umount.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,10 +393,10 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
struct libmnt_ns *ns_old;
const char *type = mnt_fs_get_fstype(cxt->fs);
const char *optstr;
char *user = NULL, *user_id = NULL, *curr_user = NULL;
char *user_id = NULL;
size_t sz;
uid_t uid;
int ok = 0;
char uidstr[sizeof(stringify_value(ULONG_MAX))];

*errsv = 0;

Expand All @@ -409,16 +409,15 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
strncmp(type, "fuseblk.", 8) != 0)
return 0;

/* get user= or user_id= from mtab/mountinfo */
optstr = mnt_fs_get_user_options(cxt->fs);
/* get user_id= from mount table */
optstr = mnt_fs_get_fs_options(cxt->fs);
if (!optstr)
return 0;

if (mnt_optstr_get_option(optstr, "user", &user, &sz) != 0 &&
mnt_optstr_get_option(optstr, "user_id", &user_id, &sz) != 0)
if (mnt_optstr_get_option(optstr, "user_id", &user_id, &sz) != 0)
return 0;

if (sz == 0 || (user == NULL && user_id == NULL))
if (sz == 0 || user_id == NULL)
return 0;

/* get current user */
Expand All @@ -429,32 +428,14 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
}

uid = getuid();
if (user)
curr_user = mnt_get_username(uid);

if (!mnt_context_switch_ns(cxt, ns_old)) {
*errsv = -MNT_ERR_NAMESPACE;
return 0;
}

if (user && !curr_user) {
DBG(CXT, ul_debugobj(cxt, "umount (fuse): cannot "
"convert %d to username", uid));
return 0;
}

if (user)
ok = strncmp(curr_user, user, sz) == 0;

else if (user_id) {
char uidstr[sizeof(stringify_value(ULONG_MAX))];
snprintf(uidstr, sizeof(uidstr), "%lu", (unsigned long) uid);

ok = strncmp(user_id, uidstr, sz) == 0;
}

free(curr_user);
return ok;
snprintf(uidstr, sizeof(uidstr), "%lu", (unsigned long) uid);
return strncmp(user_id, uidstr, sz) == 0;
}

/*
Expand Down

0 comments on commit df61216

Please sign in to comment.