]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
Support unmount by not privileged users
authorNeil Brown <neilb@suse.de>
Fri, 16 Mar 2007 07:29:39 +0000 (18:29 +1100)
committerNeil Brown <neilb@suse.de>
Fri, 16 Mar 2007 07:29:39 +0000 (18:29 +1100)
Providing user=username or users is listed in mtab.

utils/mount/nfsumount.c

index eb3d1fb5ae714da80ec01c026d085f3672fbb067..381ca6e344e0bdf13d21a1760a651597f8777325 100644 (file)
  *
  */
 
+#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)