Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Oct 2020 16:17:08 +0000 (UTC)
From:      Ryan Moeller <freqlabs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r367009 - in head: sbin/sysctl sys/kern
Message-ID:  <202010241617.09OGH8ZN094676@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: freqlabs
Date: Sat Oct 24 16:17:07 2020
New Revision: 367009
URL: https://svnweb.freebsd.org/changeset/base/367009

Log:
  sysctl+kern_sysctl: Honor SKIP for descendant nodes
  
  Ensure we also skip descendants of SKIP nodes when iterating through children
  of an explicitly specified node.
  
  Reported by:	np
  Reviewed by:	np
  MFC after:	1 week
  Sponsored by:	iXsystems, Inc.
  Differential Revision:	https://reviews.freebsd.org/D26833

Modified:
  head/sbin/sysctl/sysctl.c
  head/sys/kern/kern_sysctl.c

Modified: head/sbin/sysctl/sysctl.c
==============================================================================
--- head/sbin/sysctl/sysctl.c	Sat Oct 24 16:11:46 2020	(r367008)
+++ head/sbin/sysctl/sysctl.c	Sat Oct 24 16:17:07 2020	(r367009)
@@ -952,6 +952,7 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
 static int
 show_var(int *oid, int nlen, bool honor_skip)
 {
+	static int skip_len = 0, skip_oid[CTL_MAXNAME];
 	u_char buf[BUFSIZ], *val, *oval, *p;
 	char name[BUFSIZ], fmt[BUFSIZ];
 	const char *sep, *sep1, *prntype;
@@ -1021,9 +1022,21 @@ show_var(int *oid, int nlen, bool honor_skip)
 		return (0);
 	}
 
+	/* keep track of encountered skip nodes, ignoring descendants */
+	if (skip_len == 0 && (kind & CTLFLAG_SKIP) != 0) {
+		/* Save this oid so we can skip descendants. */
+		skip_len = nlen * sizeof(int);
+		memcpy(skip_oid, oid, skip_len);
+	}
+
 	/* bail before fetching the value if we're honoring skip */
-	if (honor_skip && (kind & CTLFLAG_SKIP) != 0)
-		return (1);
+	if (honor_skip) {
+		if (0 < skip_len && skip_len <= nlen * (int)sizeof(int) &&
+		    memcmp(skip_oid, oid, skip_len) == 0)
+			return (1);
+		/* Not a skip node or descendant of a skip node. */
+		skip_len = 0;
+	}
 
 	/* don't fetch opaques that we don't know how to print */
 	if (ctltype == CTLTYPE_OPAQUE) {

Modified: head/sys/kern/kern_sysctl.c
==============================================================================
--- head/sys/kern/kern_sysctl.c	Sat Oct 24 16:11:46 2020	(r367008)
+++ head/sys/kern/kern_sysctl.c	Sat Oct 24 16:17:07 2020	(r367009)
@@ -1126,9 +1126,13 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int
 			 * We have reached a node with a full name match and are
 			 * looking for the next oid in its children.
 			 *
+			 * For CTL_SYSCTL_NEXTNOSKIP we are done.
+			 *
 			 * For CTL_SYSCTL_NEXT we skip CTLTYPE_NODE (unless it
 			 * has a handler) and move on to the children.
 			 */
+			if (!honor_skip)
+				return (0);
 			if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) 
 				return (0);
 			if (oidp->oid_handler) 
@@ -1163,9 +1167,13 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int
 			/*
 			 * We have reached the next oid.
 			 *
+			 * For CTL_SYSCTL_NEXTNOSKIP we are done.
+			 *
 			 * For CTL_SYSCTL_NEXT we skip CTLTYPE_NODE (unless it
 			 * has a handler) and move on to the children.
 			 */
+			if (!honor_skip)
+				return (0);
 			if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE)
 				return (0);
 			if (oidp->oid_handler)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010241617.09OGH8ZN094676>