diff options
author | mikeh <mikeh@FreeBSD.org> | 2003-02-23 00:24:03 +0000 |
---|---|---|
committer | mikeh <mikeh@FreeBSD.org> | 2003-02-23 00:24:03 +0000 |
commit | e34fd150f8cb9c6bcadb708854383f53b1092d05 (patch) | |
tree | 890703a473e763c2eae89cfb057bca9c97526cd4 /lib/libc/gen/setmode.c | |
parent | 0bf8ac731d79cf0c1a329e32d449f56589726ffc (diff) | |
download | FreeBSD-src-e34fd150f8cb9c6bcadb708854383f53b1092d05.zip FreeBSD-src-e34fd150f8cb9c6bcadb708854383f53b1092d05.tar.gz |
More changes from NetBSD:
* use correct error detection of realloc failure
* strtol negative return check
* use strtol to validate string instead of rolling our own
validation code
* terminate the command sequence correctly
Diffstat (limited to 'lib/libc/gen/setmode.c')
-rw-r--r-- | lib/libc/gen/setmode.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/libc/gen/setmode.c b/lib/libc/gen/setmode.c index 814e07a..fd67ec6 100644 --- a/lib/libc/gen/setmode.c +++ b/lib/libc/gen/setmode.c @@ -157,8 +157,12 @@ common: if (set->cmd2 & CMD2_CLR) { BITCMD *newset; \ setlen += SET_LEN_INCR; \ newset = realloc(saveset, sizeof(BITCMD) * setlen); \ - if (!saveset) \ + if (!newset) { \ + if (saveset) \ + free(saveset); \ + saveset = NULL; \ return (NULL); \ + } \ set = newset + (set - saveset); \ saveset = newset; \ endset = newset + (setlen - 2); \ @@ -172,11 +176,12 @@ setmode(p) const char *p; { int perm, who; - char op; + char op, *ep; BITCMD *set, *saveset, *endset; sigset_t sigset, sigoset; mode_t mask; int equalopdone=0, permXbits, setlen; + long perml; if (!*p) return (NULL); @@ -205,17 +210,14 @@ setmode(p) * or illegal bits. */ if (isdigit((unsigned char)*p)) { - perm = (mode_t)strtol(p, NULL, 8); - if (perm & ~(STANDARD_BITS|S_ISTXT)) { + perml = strtol(p, &ep, 8); + if (*ep || perml < 0 || perml & ~(STANDARD_BITS|S_ISTXT)) { free(saveset); return (NULL); } - while (*++p) - if (*p < '0' || *p > '7') { - free(saveset); - return (NULL); - } + perm = (mode_t)perml; ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask); + set->cmd = 0; return (saveset); } |