From 8626862c76fd7791175439bd642445944bf6e69a Mon Sep 17 00:00:00 2001 From: Alexandre Perrin Date: Fri, 22 Nov 2013 19:48:23 +0100 Subject: [PATCH] Add proper const keywords to sysctl(3) parameters. Import some sysctl(3) patches from FreeBSD. - r204170 change the sysctl(3) and sysctlbyname(3) interfaces so they are in sync with FreeBSD and NetBSD. - r240176 Avoid a potential segfault in libc when the `name' argument is invalid. - r204172 & r244153 are cosmetics changes. Here follow the commit message from r204170 and r240176: - r204170: Add proper const keywords to sysctl(3) parameters. The `name' and `newp' arguments can be marked const, because the buffers they refer to are never changed. While there, perform some other cleanups: * Remove K&R from sysctl.c. * Implement sysctlbyname() using sysctlnametomib() to prevent duplication of an undocumented kernel interface. * Fix some whitespace nits. - r240176: Avoid segfault if name is invalid. Basically, only check for CTL_USER if the sysctl fails with ENOENT. --- lib/libc/gen/sysctl.3 | 8 ++++---- lib/libc/gen/sysctl.c | 17 ++++++++++------- lib/libc/gen/sysctlbyname.c | 25 +++++++------------------ lib/libc/gen/sysctlnametomib.c | 8 ++++---- sys/sys/sysctl.h | 6 +++--- 5 files changed, 28 insertions(+), 36 deletions(-) diff --git a/lib/libc/gen/sysctl.3 b/lib/libc/gen/sysctl.3 index 61e3d31..f33288d 100644 --- a/lib/libc/gen/sysctl.3 +++ b/lib/libc/gen/sysctl.3 @@ -26,10 +26,10 @@ .\" SUCH DAMAGE. .\" .\" @(#)sysctl.3 8.4 (Berkeley) 5/9/95 -.\" $FreeBSD: src/lib/libc/gen/sysctl.3,v 1.33.2.13 2002/04/07 04:57:14 dd Exp $ +.\" $FreeBSD: head/lib/libc/gen/sysctl.3 204170 2010-02-21 13:57:02Z ed $ .\" $DragonFly: src/lib/libc/gen/sysctl.3,v 1.10 2008/05/02 02:05:03 swildner Exp $ .\" -.Dd January 23, 2001 +.Dd November 21, 2013 .Dt SYSCTL 3 .Os .Sh NAME @@ -43,9 +43,9 @@ .In sys/types.h .In sys/sysctl.h .Ft int -.Fn sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen" +.Fn sysctl "const int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen" .Ft int -.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen" +.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen" .Ft int .Fn sysctlnametomib "const char *name" "int *mibp" "size_t *sizep" .Sh DESCRIPTION diff --git a/lib/libc/gen/sysctl.c b/lib/libc/gen/sysctl.c index b9fc0ef..fe56b48 100644 --- a/lib/libc/gen/sysctl.c +++ b/lib/libc/gen/sysctl.c @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)sysctl.c 8.2 (Berkeley) 1/4/94 - * $FreeBSD: src/lib/libc/gen/sysctl.c,v 1.6 2007/01/09 00:27:55 imp Exp $ + * $FreeBSD: head/lib/libc/gen/sysctl.c 240176 2012-09-06 20:15:44Z trhodes $ * $DragonFly: src/lib/libc/gen/sysctl.c,v 1.3 2005/11/13 00:07:42 swildner Exp $ */ @@ -41,15 +41,18 @@ #include #include -extern int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, - void *newp, size_t newlen); +extern int __sysctl(const int *name, u_int namelen, void *oldp, + size_t *oldlenp, const void *newp, size_t newlen); int -sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, - size_t newlen) +sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp, + const void *newp, size_t newlen) { - if (name[0] != CTL_USER) - return (__sysctl(name, namelen, oldp, oldlenp, newp, newlen)); + int retval; + + retval = __sysctl(name, namelen, oldp, oldlenp, newp, newlen); + if (retval != -1 || errno != ENOENT || name[0] != CTL_USER) + return (retval); if (newp != NULL) { errno = EPERM; diff --git a/lib/libc/gen/sysctlbyname.c b/lib/libc/gen/sysctlbyname.c index 74de709..b2fcd67 100644 --- a/lib/libc/gen/sysctlbyname.c +++ b/lib/libc/gen/sysctlbyname.c @@ -6,33 +6,22 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $FreeBSD: src/lib/libc/gen/sysctlbyname.c,v 1.4 1999/08/27 23:59:01 peter Exp $ + * $FreeBSD: head/lib/libc/gen/sysctlbyname.c 244153 2012-12-12 15:27:33Z pjd $ * $DragonFly: src/lib/libc/gen/sysctlbyname.c,v 1.2 2003/06/17 04:26:42 dillon Exp $ * */ #include #include -#include int -sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, - size_t newlen) +sysctlbyname(const char *name, void *oldp, size_t *oldlenp, + const void *newp, size_t newlen) { - int name2oid_oid[2]; int real_oid[CTL_MAXNAME+2]; - int error; size_t oidlen; - name2oid_oid[0] = 0; /* This is magic & undocumented! */ - name2oid_oid[1] = 3; - - oidlen = sizeof(real_oid); - error = sysctl(name2oid_oid, 2, real_oid, &oidlen, (void *)name, - strlen(name)); - if (error < 0) - return error; - oidlen /= sizeof (int); - error = sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen); - return (error); + oidlen = sizeof(real_oid) / sizeof(int); + if (sysctlnametomib(name, real_oid, &oidlen) < 0) + return (-1); + return (sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen)); } - diff --git a/lib/libc/gen/sysctlnametomib.c b/lib/libc/gen/sysctlnametomib.c index a863b33..708cd86 100644 --- a/lib/libc/gen/sysctlnametomib.c +++ b/lib/libc/gen/sysctlnametomib.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libc/gen/sysctlnametomib.c,v 1.4 2003/01/04 00:11:11 tjr Exp $ + * $FreeBSD: head/lib/libc/gen/sysctlnametomib.c 204170 2010-02-21 13:57:02Z ed $ * $DragonFly: src/lib/libc/gen/sysctlnametomib.c,v 1.3 2005/11/19 22:32:53 swildner Exp $ */ @@ -48,8 +48,8 @@ sysctlnametomib(const char *name, int *mibp, size_t *sizep) oid[0] = 0; oid[1] = 3; - *sizep *= sizeof (int); - error = sysctl(oid, 2, mibp, sizep, (void *)name, strlen(name)); - *sizep /= sizeof (int); + *sizep *= sizeof(int); + error = sysctl(oid, 2, mibp, sizep, name, strlen(name)); + *sizep /= sizeof(int); return (error); } diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 6659977..baddeab 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)sysctl.h 8.1 (Berkeley) 6/2/93 - * $FreeBSD: src/sys/sys/sysctl.h,v 1.81.2.10 2003/05/01 22:48:09 trhodes Exp $ + * $FreeBSD: head/sys/sys/sysctl.h 204170 2010-02-21 13:57:02Z ed $ * $DragonFly: src/sys/sys/sysctl.h,v 1.29 2008/09/30 12:20:29 hasso Exp $ */ @@ -660,8 +660,8 @@ int sysctl_int_range(SYSCTL_HANDLER_ARGS, int low, int high); #include __BEGIN_DECLS -int sysctl (int *, u_int, void *, size_t *, void *, size_t); -int sysctlbyname (const char *, void *, size_t *, void *, size_t); +int sysctl(const int *, u_int, void *, size_t *, const void *, size_t); +int sysctlbyname(const char *, void *, size_t *, const void *, size_t); int sysctlnametomib (const char *, int *, size_t *); __END_DECLS -- 1.8.4.1