Module Name: src Committed By: gson Date: Sat Aug 9 07:05:42 UTC 2014
Modified Files: src/sys/kern: kern_sysctl.c Log Message: Remove the code to allow CTLTYPE_INT and CTLTYPE_QUAD to be read and written as either 4 or 8 byte values regardless of the type, in accordance with "Core statement on sysctl 32-bit/64-bit changes", http://mail-index.netbsd.org/tech-kern/2014/03/26/msg016779.html. To generate a diff of this commit: cvs rdiff -u -r1.251 -r1.252 src/sys/kern/kern_sysctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_sysctl.c diff -u src/sys/kern/kern_sysctl.c:1.251 src/sys/kern/kern_sysctl.c:1.252 --- src/sys/kern/kern_sysctl.c:1.251 Thu Jun 12 22:10:04 2014 +++ src/sys/kern/kern_sysctl.c Sat Aug 9 07:05:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sysctl.c,v 1.251 2014/06/12 22:10:04 joerg Exp $ */ +/* $NetBSD: kern_sysctl.c,v 1.252 2014/08/09 07:05:42 gson Exp $ */ /*- * Copyright (c) 2003, 2007, 2008 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_sysctl.c,v 1.251 2014/06/12 22:10:04 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sysctl.c,v 1.252 2014/08/09 07:05:42 gson Exp $"); #include "opt_defcorename.h" #include "ksyms.h" @@ -1423,9 +1423,7 @@ sysctl_lookup(SYSCTLFN_ARGS) { int error, rw; size_t sz, len; - void *d, *d_out; - uint64_t qval; - int ival; + void *d; KASSERT(rw_lock_held(&sysctl_treelock)); @@ -1501,38 +1499,13 @@ sysctl_lookup(SYSCTLFN_ARGS) d = __UNCONST(&rnode->sysctl_qdata); } else d = rnode->sysctl_data; - d_out = d; - sz = rnode->sysctl_size; - switch (SYSCTL_TYPE(rnode->sysctl_flags)) { - case CTLTYPE_INT: - /* Allow for 64bit read of 32bit value */ - if (*oldlenp != sz && *oldlenp == sizeof (uint64_t)) { - qval = *(int *)d; - d_out = &qval; - sz = sizeof (uint64_t); - } - break; - case CTLTYPE_QUAD: - /* Allow for 32bit read of 64bit value */ - if (*oldlenp != sz && *oldlenp == sizeof (int)) { - qval = *(uint64_t *)d; - ival = qval; - /* Replace out of range values with -1 */ - if (ival != qval) - ival = -1; - d_out = &ival; - sz = sizeof (int); - } - break; - case CTLTYPE_STRING: + if (SYSCTL_TYPE(rnode->sysctl_flags) == CTLTYPE_STRING) sz = strlen(d) + 1; /* XXX@@@ possible fault here */ - break; - default: - break; - } + else + sz = rnode->sysctl_size; if (oldp != NULL) { - error = sysctl_copyout(l, d_out, oldp, MIN(sz, *oldlenp)); + error = sysctl_copyout(l, d, oldp, MIN(sz, *oldlenp)); if (error) { DPRINTF(("%s: bad copyout %d\n", __func__, error)); return error; @@ -1575,27 +1548,6 @@ sysctl_lookup(SYSCTLFN_ARGS) } case CTLTYPE_INT: case CTLTYPE_QUAD: - /* Allow 32bit of 64bit integers */ - if (newlen == sizeof (uint64_t)) { - error = sysctl_copyin(l, newp, &qval, sizeof qval); - } else if (newlen == sizeof (int)) { - error = sysctl_copyin(l, newp, &ival, sizeof ival); - qval = ival; - } else { - goto bad_size; - } - if (!error) { - if (SYSCTL_TYPE(rnode->sysctl_flags) == CTLTYPE_INT) { - ival = qval; - /* Error out of range values */ - if (ival != qval) - goto bad_size; - *(int *)d = ival; - } else { - *(uint64_t *)d = qval; - } - } - break; case CTLTYPE_STRUCT: /* * these data must be *exactly* the same size coming