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;
 }
 
 /*

Reply via email to