show_sysctl_all: reduce copying, please coverity

Modify db_show_sysctl_all so that it does not copy more than once the
data of the input oid, and so that what it passes to db_show_oid does
not alarm coverity.

Reviewed by:	markj
Differential Revision:	https://reviews.freebsd.org/D36847
This commit is contained in:
Doug Moore 2022-10-01 12:20:04 -05:00
parent dddafa8d25
commit e5f93d1078

View File

@ -2765,12 +2765,12 @@ static void
db_show_oid_name(int *oid, size_t nlen)
{
struct sysctl_oid *oidp;
int qoid[CTL_MAXNAME+2];
int qoid[CTL_MAXNAME + 2];
int error;
qoid[0] = 0;
qoid[0] = CTL_SYSCTL;
qoid[1] = CTL_SYSCTL_NAME;
memcpy(qoid + 2, oid, nlen * sizeof(int));
qoid[1] = 1;
error = sysctl_find_oid(qoid, nlen + 2, &oidp, NULL, NULL);
if (error)
@ -2856,25 +2856,24 @@ static int
db_show_sysctl_all(int *oid, size_t len, int flags)
{
struct sysctl_oid *oidp;
int name1[CTL_MAXNAME + 2], name2[CTL_MAXNAME + 2];
size_t l1, l2;
int qoid[CTL_MAXNAME + 2], next[CTL_MAXNAME];
size_t nlen;
name1[0] = CTL_SYSCTL;
name1[1] = CTL_SYSCTL_NEXT;
l1 = 2;
qoid[0] = CTL_SYSCTL;
qoid[1] = CTL_SYSCTL_NEXT;
if (len) {
memcpy(name1 + 2, oid, len * sizeof(int));
l1 += len;
nlen = len;
memcpy(&qoid[2], oid, nlen * sizeof(int));
} else {
name1[2] = CTL_KERN;
l1++;
nlen = 1;
qoid[2] = CTL_KERN;
}
for (;;) {
int i, error;
int error;
size_t nextsize = sizeof(next);
l2 = sizeof(name2);
error = kernel_sysctl(kdb_thread, name1, l1,
name2, &l2, NULL, 0, &l2, 0);
error = kernel_sysctl(kdb_thread, qoid, nlen + 2,
next, &nextsize, NULL, 0, &nlen, 0);
if (error != 0) {
if (error == ENOENT)
return (0);
@ -2882,27 +2881,25 @@ db_show_sysctl_all(int *oid, size_t len, int flags)
db_error("sysctl(next)");
}
l2 /= sizeof(int);
nlen /= sizeof(int);
if (l2 < (unsigned int)len)
if (nlen < (unsigned int)len)
return (0);
for (i = 0; i < len; i++)
if (name2[i] != oid[i])
return (0);
if (memcmp(&oid[0], &next[0], len * sizeof(int)) != 0)
return (0);
/* Find the OID in question */
error = sysctl_find_oid(name2, l2, &oidp, NULL, NULL);
error = sysctl_find_oid(next, nlen, &oidp, NULL, NULL);
if (error)
return (error);
i = db_show_oid(oidp, name2, l2, flags | DB_SYSCTL_SAFE_ONLY);
(void)db_show_oid(oidp, next, nlen, flags | DB_SYSCTL_SAFE_ONLY);
if (db_pager_quit)
return (0);
memcpy(name1+2, name2, l2 * sizeof(int));
l1 = 2 + l2;
memcpy(&qoid[2 + len], &next[len], (nlen - len) * sizeof(int));
}
}