Page MenuHomeFreeBSD

D32993.diff
No OneTemporary

D32993.diff

diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -3537,6 +3537,8 @@
struct group *gr;
gid_t groups[NGROUPS_MAX + 1];
int ngroups;
+ unsigned long name_ul;
+ char *end = NULL;
/*
* Set up the unprivileged user.
@@ -3551,10 +3553,11 @@
names = namelist;
name = strsep_quote(&names, ":");
/* Bug? name could be NULL here */
- if (isdigit(*name) || *name == '-')
- pw = getpwuid(atoi(name));
- else
+ name_ul = strtoul(name, &end, 10);
+ if (*end != '\0' || end == name)
pw = getpwnam(name);
+ else
+ pw = getpwuid((uid_t)name_ul);
/*
* Credentials specified as those of a user.
*/
@@ -3576,8 +3579,9 @@
if (ngroups > 1 && groups[0] == groups[1]) {
ngroups--;
inpos = 2;
- } else
+ } else {
inpos = 1;
+ }
if (ngroups > NGROUPS_MAX)
ngroups = NGROUPS_MAX;
if (ngroups > SMALLNGROUPS)
@@ -3592,25 +3596,26 @@
* Explicit credential specified as a colon separated list:
* uid:gid:gid:...
*/
- if (pw != NULL)
+ if (pw != NULL) {
cr->cr_uid = pw->pw_uid;
- else if (isdigit(*name) || *name == '-')
- cr->cr_uid = atoi(name);
- else {
+ } else if (*end != '\0' || end == name) {
syslog(LOG_ERR, "unknown user: %s", name);
return;
+ } else {
+ cr->cr_uid = name_ul;
}
cr->cr_ngroups = 0;
while (names != NULL && *names != '\0' && cr->cr_ngroups < NGROUPS_MAX) {
name = strsep_quote(&names, ":");
- if (isdigit(*name) || *name == '-') {
- groups[cr->cr_ngroups++] = atoi(name);
- } else {
+ name_ul = strtoul(name, &end, 10);
+ if (*end != '\0' || end == name) {
if ((gr = getgrnam(name)) == NULL) {
syslog(LOG_ERR, "unknown group: %s", name);
continue;
}
groups[cr->cr_ngroups++] = gr->gr_gid;
+ } else {
+ groups[cr->cr_ngroups++] = name_ul;
}
}
if (names != NULL && *names != '\0' && cr->cr_ngroups == NGROUPS_MAX)

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 28, 7:18 AM (4 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16258673
Default Alt Text
D32993.diff (1 KB)

Event Timeline