diff options
author | Ted Unangst <tedu@cvs.openbsd.org> | 2003-10-24 19:05:22 +0000 |
---|---|---|
committer | Ted Unangst <tedu@cvs.openbsd.org> | 2003-10-24 19:05:22 +0000 |
commit | ea53828bc84e5f0d4bf9cfe653c2b459bb34b8d4 (patch) | |
tree | be27b6c0ba44e1490184923e87f7b46b2db94abe /sys | |
parent | 76f7958a85554bcc6e4205a751a426c7d745c591 (diff) |
refactor stackgap sysctl. prompted by a bug report from Michael Coulter.
ok deraadt@ markus@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/kern_sysctl.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 4a4a6a3128a..0dee4aaf506 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.89 2003/08/23 20:02:59 tedu Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.90 2003/10/24 19:05:21 tedu Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -244,7 +244,7 @@ kern_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) size_t newlen; struct proc *p; { - int error, level, inthostid, oldsgap; + int error, level, inthostid, stackgap; extern int somaxconn, sominconn; extern int usermount, nosuidcoredump; extern long cp_time[CPUSTATES]; @@ -439,19 +439,18 @@ kern_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) case KERN_POOL: return (sysctl_dopool(name + 1, namelen - 1, oldp, oldlenp)); case KERN_STACKGAPRANDOM: - oldsgap = stackgap_random; - - error = sysctl_int(oldp, oldlenp, newp, newlen, &stackgap_random); + stackgap = stackgap_random; + error = sysctl_int(oldp, oldlenp, newp, newlen, &stackgap); + if (error) + return (error); /* * Safety harness. */ - if ((stackgap_random < ALIGNBYTES && stackgap_random != 0) || - !powerof2(stackgap_random) || - stackgap_random > PAGE_SIZE * 2) { - stackgap_random = oldsgap; + if ((stackgap < ALIGNBYTES && stackgap != 0) || + !powerof2(stackgap)) return (EINVAL); - } - return (error); + stackgap_random = stackgap; + return (0); #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM) case KERN_SYSVIPC_INFO: return (sysctl_sysvipc(name + 1, namelen - 1, oldp, oldlenp)); |