5d1ba801b2
Resolves: #800621
84 lines
2.5 KiB
Diff
84 lines
2.5 KiB
Diff
From f6384b4fe1ffdeebee3e9d73dd533a4fbf83b6d8 Mon Sep 17 00:00:00 2001
|
|
From: Jeff Layton <jlayton@samba.org>
|
|
Date: Thu, 23 Feb 2012 10:42:09 -0500
|
|
Subject: [PATCH] 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>
|
|
---
|
|
mount.cifs.c | 12 +++++++-----
|
|
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);
|
|
--
|
|
1.7.7.6
|
|
|