summaryrefslogtreecommitdiffstats
path: root/libmount/src/optstr.c
diff options
context:
space:
mode:
authorKarel Zak2015-10-12 11:42:13 +0200
committerKarel Zak2015-10-12 11:42:13 +0200
commit440a355a3d3934d99f7ef82adf02342e6f2f7983 (patch)
tree8203b4c5b88619b2771ff18bdcfff44476e98f70 /libmount/src/optstr.c
parentinclude/pt-mbr-partnames: remove '|' from partition type name (diff)
downloadkernel-qcow2-util-linux-440a355a3d3934d99f7ef82adf02342e6f2f7983.tar.gz
kernel-qcow2-util-linux-440a355a3d3934d99f7ef82adf02342e6f2f7983.tar.xz
kernel-qcow2-util-linux-440a355a3d3934d99f7ef82adf02342e6f2f7983.zip
libmount: fix uid= and gid= translation
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>
Diffstat (limited to 'libmount/src/optstr.c')
-rw-r--r--libmount/src/optstr.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c
index 198890d12..9b21e63b1 100644
--- a/libmount/src/optstr.c
+++ b/libmount/src/optstr.c
@@ -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;
}
/*