Do not fail on partial ctl path for ctl_nametomib()

We do not fail on partial ctl path when the given `mib` array is
shorter than the given name, and we should keep the behavior the
same in the reverse case, which I feel is also the more natural way.
This commit is contained in:
Yinan Zhang 2020-08-13 13:26:44 -07:00
parent 6ab181d2b7
commit f2e1a5be77
2 changed files with 17 additions and 6 deletions

View File

@ -1387,7 +1387,8 @@ ctl_lookup(tsdn_t *tsdn, const ctl_named_node_t *starting_node,
mibp[i] = (size_t)index; mibp[i] = (size_t)index;
} }
if (node->ctl != NULL) { /* Reached the end? */
if (node->ctl != NULL || *dot == '\0') {
/* Terminal node. */ /* Terminal node. */
if (*dot != '\0') { if (*dot != '\0') {
/* /*
@ -1403,11 +1404,6 @@ ctl_lookup(tsdn_t *tsdn, const ctl_named_node_t *starting_node,
} }
/* Update elm. */ /* Update elm. */
if (*dot == '\0') {
/* No more elements. */
ret = ENOENT;
goto label_return;
}
elm = &dot[1]; elm = &dot[1];
dot = ((tdot = strchr(elm, '.')) != NULL) ? tdot : dot = ((tdot = strchr(elm, '.')) != NULL) ? tdot :
strchr(elm, '\0'); strchr(elm, '\0');

View File

@ -117,6 +117,20 @@ TEST_BEGIN(test_mallctlnametomib_short_mib) {
} }
TEST_END TEST_END
TEST_BEGIN(test_mallctlnametomib_short_name) {
size_t mib[4];
size_t miblen;
miblen = 4;
mib[3] = 42;
expect_d_eq(mallctlnametomib("arenas.bin.0", mib, &miblen), 0,
"Unexpected mallctlnametomib() failure");
expect_zu_eq(miblen, 3, "Unexpected mib output length");
expect_zu_eq(mib[3], 42,
"mallctlnametomib() wrote past the end of the input mib");
}
TEST_END
TEST_BEGIN(test_mallctl_config) { TEST_BEGIN(test_mallctl_config) {
#define TEST_MALLCTL_CONFIG(config, t) do { \ #define TEST_MALLCTL_CONFIG(config, t) do { \
t oldval; \ t oldval; \
@ -1106,6 +1120,7 @@ main(void) {
test_mallctlbymib_errors, test_mallctlbymib_errors,
test_mallctl_read_write, test_mallctl_read_write,
test_mallctlnametomib_short_mib, test_mallctlnametomib_short_mib,
test_mallctlnametomib_short_name,
test_mallctl_config, test_mallctl_config,
test_mallctl_opt, test_mallctl_opt,
test_manpage_example, test_manpage_example,