diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1998-11-18 23:28:35 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1998-11-18 23:28:35 +0000 |
commit | ef92654de6d376fafea5539e2bc10d2ed4acbb85 (patch) | |
tree | 5d5574e83d0478a9d5f8af330fec183ba449a8aa | |
parent | 907c21b6251939fe5065711d48e130e7a75c2f5a (diff) |
negative change strtol()
-rw-r--r-- | lib/libc/gen/setmode.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/libc/gen/setmode.c b/lib/libc/gen/setmode.c index 72349eadfc6..c33521496f7 100644 --- a/lib/libc/gen/setmode.c +++ b/lib/libc/gen/setmode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setmode.c,v 1.8 1998/08/14 21:39:33 deraadt Exp $ */ +/* $OpenBSD: setmode.c,v 1.9 1998/11/18 23:28:34 deraadt Exp $ */ /* $NetBSD: setmode.c,v 1.15 1997/02/07 22:21:06 christos Exp $ */ /* @@ -41,7 +41,7 @@ #if 0 static char sccsid[] = "@(#)setmode.c 8.2 (Berkeley) 3/25/94"; #else -static char rcsid[] = "$OpenBSD: setmode.c,v 1.8 1998/08/14 21:39:33 deraadt Exp $"; +static char rcsid[] = "$OpenBSD: setmode.c,v 1.9 1998/11/18 23:28:34 deraadt Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -188,6 +188,7 @@ setmode(p) sigset_t sigset, sigoset; mode_t mask; int equalopdone, permXbits, setlen; + long perml; if (!*p) return (NULL); @@ -216,11 +217,12 @@ setmode(p) * or illegal bits. */ if (isdigit(*p)) { - perm = (mode_t)strtol(p, NULL, 8); - if (perm & ~(STANDARD_BITS|S_ISTXT)) { + perml = strtol(p, NULL, 8); + if (perml < 0 || (perml & ~(STANDARD_BITS|S_ISTXT))) { free(saveset); return (NULL); } + perm = (mode_t)perml; while (*++p) if (*p < '0' || *p > '7') { free(saveset); |