diff options
author | Neil Brown <neilb@suse.de> | 2007-03-16 18:29:39 +1100 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-03-16 18:29:39 +1100 |
commit | 03187a3cf1995b487c291ea8bc746a9e29e1c2f4 (patch) | |
tree | a0a34920ee46df1348d57f6e761541c9c3b1f43e /utils | |
parent | a64b65aac7af65f96a24cd89fc07a31dbb5980ab (diff) | |
download | nfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.tar.gz nfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.tar.xz nfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.zip |
Support unmount by not privileged users
Providing user=username or users is listed in mtab.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/mount/nfsumount.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index eb3d1fb..381ca6e 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -17,12 +17,14 @@ * */ +#include <unistd.h> #include <stdio.h> #include <errno.h> #include <getopt.h> #include <mntent.h> #include <sys/mount.h> #include <ctype.h> +#include <pwd.h> #include "xcommon.h" #include "fstab.h" @@ -324,6 +326,35 @@ int nfsumount(int argc, char *argv[]) if (!mc && verbose) printf(_("Could not find %s in mtab\n"), spec); + if (getuid() != 0) { + /* only permitted if "user=" or "users" is in mount options */ + if (!mc) { + only_root: + fprintf(stderr,"%s: You are not permitted to unmount %s\n", + progname, spec); + return 0; + } + if (hasmntopt(&mc->m, "users") == NULL) { + char *opt = hasmntopt(&mc->m, "user"); + struct passwd *pw; + char *comma; + int len; + if (!opt) + goto only_root; + if (opt[5] != '=') + goto only_root; + comma = strchr(opt, ','); + if (comma) + len = comma - (opt + 5); + else + len = strlen(opt+5); + pw = getpwuid(getuid()); + if (pw == NULL || strlen(pw->pw_name) != len + || strncmp(pw->pw_name, opt+5, len) != 0) + goto only_root; + } + } + ret = 0; if (mc) { if (!lazy) |