From 791381a715bac0f2910101bf0d6cceac9e569452 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 12 Oct 2015 11:42:13 +0200 Subject: [PATCH 196/197] 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 Addresses: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=801527 Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1747710 Upstream: http://github.com/karelzak/util-linux/commit/440a355a3d3934d99f7ef82adf02342e6f2f7983 Signed-off-by: Karel Zak --- libmount/src/optstr.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c index 7bd9bbdb5..63b98c754 100644 --- a/libmount/src/optstr.c +++ b/libmount/src/optstr.c @@ -962,7 +962,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) @@ -974,10 +973,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; @@ -985,16 +985,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; } /* @@ -1009,7 +1010,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) @@ -1021,9 +1021,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) @@ -1032,15 +1033,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; } /* -- 2.25.2