summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authormikeh <mikeh@FreeBSD.org>2003-02-23 00:24:03 +0000
committermikeh <mikeh@FreeBSD.org>2003-02-23 00:24:03 +0000
commite34fd150f8cb9c6bcadb708854383f53b1092d05 (patch)
tree890703a473e763c2eae89cfb057bca9c97526cd4 /lib/libc
parent0bf8ac731d79cf0c1a329e32d449f56589726ffc (diff)
downloadFreeBSD-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')
-rw-r--r--lib/libc/gen/setmode.c20
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);
}
OpenPOWER on IntegriCloud