From e34fd150f8cb9c6bcadb708854383f53b1092d05 Mon Sep 17 00:00:00 2001 From: mikeh Date: Sun, 23 Feb 2003 00:24:03 +0000 Subject: 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 --- lib/libc/gen/setmode.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'lib') 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); } -- cgit v1.1