Module Name: src Committed By: christos Date: Sat Apr 27 17:13:51 UTC 2013
Modified Files: src/sys/kern: kern_sysctl.c Log Message: Add debugging info. To generate a diff of this commit: cvs rdiff -u -r1.240 -r1.241 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.240 src/sys/kern/kern_sysctl.c:1.241 --- src/sys/kern/kern_sysctl.c:1.240 Fri Feb 8 20:20:08 2013 +++ src/sys/kern/kern_sysctl.c Sat Apr 27 13:13:50 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sysctl.c,v 1.240 2013/02/09 01:20:08 christos Exp $ */ +/* $NetBSD: kern_sysctl.c,v 1.241 2013/04/27 17:13:50 christos 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.240 2013/02/09 01:20:08 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sysctl.c,v 1.241 2013/04/27 17:13:50 christos Exp $"); #include "opt_defcorename.h" #include "ksyms.h" @@ -106,6 +106,13 @@ static int sysctl_log_realloc(struct sys typedef void sysctl_setup_func(struct sysctllog **); +#define SYSCTL_DEBUG +#ifdef SYSCTL_DEBUG +#define DPRINTF(a) printf a +#else +#define DPRINTF(a) +#endif + struct sysctllog { const struct sysctlnode *log_root; int *log_num; @@ -1433,8 +1440,8 @@ sysctl_lookup(SYSCTLFN_ARGS) KASSERT(rw_lock_held(&sysctl_treelock)); if (SYSCTL_VERS(rnode->sysctl_flags) != SYSCTL_VERSION) { - printf("sysctl_lookup: rnode %p wrong version\n", rnode); - return (EINVAL); + printf("%s: rnode %p wrong version\n", __func__, rnode); + return EINVAL; } error = 0; @@ -1443,16 +1450,20 @@ sysctl_lookup(SYSCTLFN_ARGS) * you can't "look up" a node. you can "query" it, but you * can't "look it up". */ - if (SYSCTL_TYPE(rnode->sysctl_flags) == CTLTYPE_NODE || namelen != 0) - return (EINVAL); + if (SYSCTL_TYPE(rnode->sysctl_flags) == CTLTYPE_NODE || namelen != 0) { + DPRINTF(("%s: can't lookup a node\n", __func__)); + return EINVAL; + } /* * some nodes are private, so only root can look into them. */ if (l != NULL && (rnode->sysctl_flags & CTLFLAG_PRIVATE) && (error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_SYSCTL, - KAUTH_REQ_SYSTEM_SYSCTL_PRVT, NULL, NULL, NULL)) != 0) - return (error); + KAUTH_REQ_SYSTEM_SYSCTL_PRVT, NULL, NULL, NULL)) != 0) { + DPRINTF(("%s: private node\n", __func__)); + return error; + } /* * if a node wants to be writable according to different rules @@ -1464,8 +1475,10 @@ sysctl_lookup(SYSCTLFN_ARGS) !(rnode->sysctl_flags & CTLFLAG_ANYWRITE) && (error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_SYSCTL, KAUTH_REQ_SYSTEM_SYSCTL_MODIFY, NULL, NULL, - NULL)) != 0) - return (error); + NULL)) != 0) { + DPRINTF(("%s: can't modify\n", __func__)); + return error; + } /* * is this node supposedly writable? @@ -1476,8 +1489,10 @@ sysctl_lookup(SYSCTLFN_ARGS) * it appears not to be writable at this time, so if someone * tried to write to it, we must tell them to go away */ - if (!rw && newp != NULL) - return (EPERM); + if (!rw && newp != NULL) { + DPRINTF(("%s: not writable\n", __func__)); + return EPERM; + } /* * step one, copy out the stuff we have presently @@ -1499,7 +1514,8 @@ sysctl_lookup(SYSCTLFN_ARGS) d = __UNCONST(&rnode->sysctl_qdata); break; default: - return (EINVAL); + DPRINTF(("%s: bad type\n", __func__)); + return EINVAL; } } else d = rnode->sysctl_data; @@ -1507,17 +1523,20 @@ sysctl_lookup(SYSCTLFN_ARGS) sz = strlen(d) + 1; /* XXX@@@ possible fault here */ else sz = rnode->sysctl_size; - if (oldp != NULL) + if (oldp != NULL) { error = sysctl_copyout(l, d, oldp, MIN(sz, *oldlenp)); - if (error) - return (error); + if (error) { + DPRINTF(("%s: bad copyout %d\n", __func__, error)); + return error; + } + } *oldlenp = sz; /* * are we done? */ if (newp == NULL || newlen == 0) - return (0); + return 0; /* * hmm...not done. must now "copy in" new value. re-adjust @@ -1531,13 +1550,20 @@ sysctl_lookup(SYSCTLFN_ARGS) * these data must be *exactly* the same size coming * in. bool may only be true or false. */ - if (newlen != sz) - return (EINVAL); + if (newlen != sz) { + DPRINTF(("%s: bad size %zu != %zu\n", __func__, newlen, + sz)); + return EINVAL; + } error = sysctl_copyin(l, newp, &tmp, sz); - if (tmp != true && tmp != false) + if (tmp != true && tmp != false) { + DPRINTF(("%s: tmp %d\n", __func__, tmp)); return EINVAL; - if (error) + } + if (error) { + DPRINTF(("%s: copyin %d\n", __func__, error)); break; + } *(bool *)d = tmp; break; } @@ -1548,8 +1574,11 @@ sysctl_lookup(SYSCTLFN_ARGS) * these data must be *exactly* the same size coming * in. */ - if (newlen != sz) - return (EINVAL); + if (newlen != sz) { + DPRINTF(("%s: bad size %zu != %zu\n", __func__, newlen, + sz)); + return EINVAL; + } error = sysctl_copyin(l, newp, d, sz); break; case CTLTYPE_STRING: { @@ -1562,20 +1591,26 @@ sysctl_lookup(SYSCTLFN_ARGS) /* * too much new string? */ - if (newlen > sz) - return (EINVAL); + if (newlen > sz) { + DPRINTF(("%s: bad size %zu > %zu\n", __func__, newlen, + sz)); + return EINVAL; + } /* * temporary copy of new inbound string */ len = MIN(sz, newlen); newbuf = malloc(len, M_SYSCTLDATA, M_WAITOK|M_CANFAIL); - if (newbuf == NULL) - return (ENOMEM); + if (newbuf == NULL) { + DPRINTF(("%s: oomem %zu\n", __func__, len)); + return ENOMEM; + } error = sysctl_copyin(l, newp, newbuf, len); if (error) { free(newbuf, M_SYSCTLDATA); - return (error); + DPRINTF(("%s: copyin %d\n", __func__, error)); + return error; } /* @@ -1584,7 +1619,8 @@ sysctl_lookup(SYSCTLFN_ARGS) */ if (newbuf[len - 1] != '\0' && len == sz) { free(newbuf, M_SYSCTLDATA); - return (EINVAL); + DPRINTF(("%s: string too long\n", __func__)); + return EINVAL; } /* @@ -1598,10 +1634,13 @@ sysctl_lookup(SYSCTLFN_ARGS) break; } default: - return (EINVAL); + DPRINTF(("%s: bad type\n", __func__)); + return EINVAL; } + if (error) + DPRINTF(("%s: copyin %d\n", __func__, error)); - return (error); + return error; } /*