aboutsummaryrefslogtreecommitdiffstats
path: root/mount.cifs.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@samba.org>2012-02-23 10:42:09 -0500
committerJeff Layton <jlayton@samba.org>2012-02-23 10:42:09 -0500
commitf6384b4fe1ffdeebee3e9d73dd533a4fbf83b6d8 (patch)
treeaa6fb65730c0099f6c3ed319fe852ad16f4f1f22 /mount.cifs.c
parent1c2f85a6aecffa7260709e5a44d77335bcade13f (diff)
downloadcifs-utils-f6384b4fe1ffdeebee3e9d73dd533a4fbf83b6d8.tar.gz
cifs-utils-f6384b4fe1ffdeebee3e9d73dd533a4fbf83b6d8.tar.xz
cifs-utils-f6384b4fe1ffdeebee3e9d73dd533a4fbf83b6d8.zip
mount.cifs: fix tests for strtoul success
The current test just looks to see if errno was 0 after the conversion but we need to do a bit more. According to the strtoul manpage: If there were no digits at all, strtoul() stores the original value of nptr in *endptr (and returns 0). So, if you pass in a string of letters, strtoul will return 0, but won't actually have converted anything. Luckily, in most cases, /bin/mount papers over this bug by doing uid/gid conversions itself before calling mount.cifs. Fix this by also checking to ensure that strtoul() converted the entire string in addition to checking that it didn't set errno. While we're at it, fix the test in backupuid/backupgid options as well which don't currently check whether errno got set. Reported-by: Kyle Squizzato <ksquizza@redhat.com> Signed-off-by: Jeff Layton <jlayton@samba.org>
Diffstat (limited to 'mount.cifs.c')
-rw-r--r--mount.cifs.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/mount.cifs.c b/mount.cifs.c
index a46a22c..824cd3a 100644
--- a/mount.cifs.c
+++ b/mount.cifs.c
@@ -1032,7 +1032,7 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
got_uid = 1;
errno = 0;
uid = strtoul(value, &ep, 10);
- if (errno == 0)
+ if (errno == 0 && *ep == '\0')
goto nocopy;
pw = getpwnam(value);
@@ -1051,7 +1051,7 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
got_cruid = 1;
errno = 0;
cruid = strtoul(value, &ep, 10);
- if (errno == 0)
+ if (errno == 0 && *ep == '\0')
goto nocopy;
pw = getpwnam(value);
@@ -1069,7 +1069,7 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
got_gid = 1;
errno = 0;
gid = strtoul(value, &ep, 10);
- if (errno == 0)
+ if (errno == 0 && *ep == '\0')
goto nocopy;
gr = getgrnam(value);
@@ -1175,8 +1175,9 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
goto nocopy;
got_bkupuid = 1;
+ errno = 0;
bkupuid = strtoul(value, &ep, 10);
- if (!strlen(ep))
+ if (errno == 0 && *ep == '\0')
goto nocopy;
pw = getpwnam(value);
@@ -1193,8 +1194,9 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
goto nocopy;
got_bkupgid = 1;
+ errno = 0;
bkupgid = strtoul(value, &ep, 10);
- if (!strlen(ep))
+ if (errno == 0 && *ep == '\0')
goto nocopy;
gr = getgrnam(value);