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
This commit is contained in:
parent
3767427354
commit
e58483c4fb
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367009
@ -952,6 +952,7 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
|
|||||||
static int
|
static int
|
||||||
show_var(int *oid, int nlen, bool honor_skip)
|
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;
|
u_char buf[BUFSIZ], *val, *oval, *p;
|
||||||
char name[BUFSIZ], fmt[BUFSIZ];
|
char name[BUFSIZ], fmt[BUFSIZ];
|
||||||
const char *sep, *sep1, *prntype;
|
const char *sep, *sep1, *prntype;
|
||||||
@ -1021,9 +1022,21 @@ show_var(int *oid, int nlen, bool honor_skip)
|
|||||||
return (0);
|
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 */
|
/* bail before fetching the value if we're honoring skip */
|
||||||
if (honor_skip && (kind & CTLFLAG_SKIP) != 0)
|
if (honor_skip) {
|
||||||
return (1);
|
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 */
|
/* don't fetch opaques that we don't know how to print */
|
||||||
if (ctltype == CTLTYPE_OPAQUE) {
|
if (ctltype == CTLTYPE_OPAQUE) {
|
||||||
|
@ -1126,9 +1126,13 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *name, u_int namelen,
|
|||||||
* We have reached a node with a full name match and are
|
* We have reached a node with a full name match and are
|
||||||
* looking for the next oid in its children.
|
* 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
|
* For CTL_SYSCTL_NEXT we skip CTLTYPE_NODE (unless it
|
||||||
* has a handler) and move on to the children.
|
* has a handler) and move on to the children.
|
||||||
*/
|
*/
|
||||||
|
if (!honor_skip)
|
||||||
|
return (0);
|
||||||
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE)
|
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE)
|
||||||
return (0);
|
return (0);
|
||||||
if (oidp->oid_handler)
|
if (oidp->oid_handler)
|
||||||
@ -1163,9 +1167,13 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *name, u_int namelen,
|
|||||||
/*
|
/*
|
||||||
* We have reached the next oid.
|
* We have reached the next oid.
|
||||||
*
|
*
|
||||||
|
* For CTL_SYSCTL_NEXTNOSKIP we are done.
|
||||||
|
*
|
||||||
* For CTL_SYSCTL_NEXT we skip CTLTYPE_NODE (unless it
|
* For CTL_SYSCTL_NEXT we skip CTLTYPE_NODE (unless it
|
||||||
* has a handler) and move on to the children.
|
* has a handler) and move on to the children.
|
||||||
*/
|
*/
|
||||||
|
if (!honor_skip)
|
||||||
|
return (0);
|
||||||
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE)
|
if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE)
|
||||||
return (0);
|
return (0);
|
||||||
if (oidp->oid_handler)
|
if (oidp->oid_handler)
|
||||||
|
Loading…
Reference in New Issue
Block a user