svn commit: r367009 - in head: sbin/sysctl sys/kern
Ryan Moeller
freqlabs at FreeBSD.org
Sat Oct 24 16:17:08 UTC 2020
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)
More information about the svn-src-all
mailing list