]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: fix uid= and gid= translation
authorKarel Zak <kzak@redhat.com>
Mon, 12 Oct 2015 09:42:13 +0000 (11:42 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 12 Oct 2015 09:42:13 +0000 (11:42 +0200)
The current libmount version returns error when no able to convert
username/groupname to uid/git.

 # mount mount /dev/sda1 /mnt/test -o uid=ignore
 # mount: failed to parse mount options

This is regression, the original mount(8) has ignored possible unknown
user/group names and the option has been used unconverted (with the
original value). For example UDF kernel driver depends on this behavior
and "uid=ignore" (or "forgot") is a valid mount option.

Fixed version (unit test):

./test_mount_optstr  --fix uid=kzak,gid=forgot,aaa,bbb
optstr: uid=kzak,gid=forgot,aaa,bbb
fixed:  uid=1000,gid=forgot,aaa,bbb

Reported-By: Anthony DeRobertis <anthony@derobert.net>
Addresses: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=801527
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/src/optstr.c

index 198890d124970ddaaede73167f173324cef05db3..9b21e63b17e3330ede964ba993a53cc30a553b52 100644 (file)
@@ -959,7 +959,6 @@ static int set_uint_value(char **optstr, unsigned int num,
  */
 int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next)
 {
-       int rc = 0;
        char *end;
 
        if (!optstr || !*optstr || !value || !valsz)
@@ -971,10 +970,11 @@ int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next)
 
        if (valsz == 7 && !strncmp(value, "useruid", 7) &&
            (*(value + 7) == ',' || !*(value + 7)))
-               rc = set_uint_value(optstr, getuid(), value, end, next);
+               return set_uint_value(optstr, getuid(), value, end, next);
 
        else if (!isdigit(*value)) {
                uid_t id;
+               int rc;
                char *p = strndup(value, valsz);
                if (!p)
                        return -ENOMEM;
@@ -982,16 +982,17 @@ int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next)
                free(p);
 
                if (!rc)
-                       rc = set_uint_value(optstr, id, value, end, next);
+                       return set_uint_value(optstr, id, value, end, next);
+       }
 
-       } else if (next) {
-               /* nothing */
+       if (next) {
+               /* no change, let's keep the original value */
                *next = value + valsz;
                if (**next == ',')
                        (*next)++;
        }
 
-       return rc;
+       return 0;
 }
 
 /*
@@ -1006,7 +1007,6 @@ int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next)
  */
 int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next)
 {
-       int rc = 0;
        char *end;
 
        if (!optstr || !*optstr || !value || !valsz)
@@ -1018,9 +1018,10 @@ int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next)
 
        if (valsz == 7 && !strncmp(value, "usergid", 7) &&
            (*(value + 7) == ',' || !*(value + 7)))
-               rc = set_uint_value(optstr, getgid(), value, end, next);
+               return set_uint_value(optstr, getgid(), value, end, next);
 
        else if (!isdigit(*value)) {
+               int rc;
                gid_t id;
                char *p = strndup(value, valsz);
                if (!p)
@@ -1029,15 +1030,17 @@ int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next)
                free(p);
 
                if (!rc)
-                       rc = set_uint_value(optstr, id, value, end, next);
+                       return set_uint_value(optstr, id, value, end, next);
+
+       }
 
-       } else if (next) {
+       if (next) {
                /* nothing */
                *next = value + valsz;
                if (**next == ',')
                        (*next)++;
        }
-       return rc;
+       return 0;
 }
 
 /*