summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2025-03-14 10:33:16 -0400
committerGitHub <noreply@github.com>2025-03-14 10:33:16 -0400
commitdbecefb6c6eac3ad9d798e66ae2a8c572590c0bd (patch)
treebb9e0e202ba7921fde81e5e775e51187a925769a
parente5848deedf01f77194b3cff457dc462230c257da (diff)
parent2586c4c3edeab982d65071e5d90329ba47189af4 (diff)
Merge pull request #18383 from LabNConsulting/chopps/fix-oper-state-list-query-bug
Fix bug with oper-state queries including list node
-rw-r--r--lib/darr.h17
-rw-r--r--lib/northbound_oper.c1
-rw-r--r--tests/lib/test_darr.c4
3 files changed, 22 insertions, 0 deletions
diff --git a/lib/darr.h b/lib/darr.h
index 084c2a103a..4638b904d1 100644
--- a/lib/darr.h
+++ b/lib/darr.h
@@ -62,6 +62,7 @@
* - darr_strdup
* - darr_strdup_cap
* - darr_strlen
+ * - darr_strlen_fixup
* - darr_strnul
* - darr_sprintf, darr_vsprintf
*/
@@ -753,6 +754,22 @@ void *__darr_resize(void *a, uint count, size_t esize, struct memtype *mt);
})
/**
+ * Fixup darr_len (and thus darr_strlen) for `S` based on its strlen(S)
+ * (i.e., scan for NUL byte). The dynamic array length will be set to strlen(S) + 1.
+ *
+ * Args:
+ * S: The dynamic array with a NUL terminated string, cannot be NULL.
+ *
+ * Return:
+ * The calculated strlen() value.
+ */
+#define darr_strlen_fixup(S) \
+ ({ \
+ _darr_len(S) = strlen(S) + 1; \
+ darr_strlen(S); \
+ })
+
+/**
* darr_vsprintf() - vsprintf into a new dynamic array.
*
* Args:
diff --git a/lib/northbound_oper.c b/lib/northbound_oper.c
index ad495b6f9c..c27fe3c019 100644
--- a/lib/northbound_oper.c
+++ b/lib/northbound_oper.c
@@ -407,6 +407,7 @@ static enum nb_error nb_op_xpath_to_trunk(const char *xpath_in, char **xpath_out
ret = yang_xpath_pop_node(xpath);
if (ret != NB_OK)
break;
+ darr_strlen_fixup(xpath);
}
if (ret == NB_OK)
*xpath_out = xpath;
diff --git a/tests/lib/test_darr.c b/tests/lib/test_darr.c
index 87f9e3e564..be319db1c1 100644
--- a/tests/lib/test_darr.c
+++ b/tests/lib/test_darr.c
@@ -48,6 +48,7 @@
* [x] - darr_strdup
* [x] - darr_strdup_cap
* [x] - darr_strlen
+ * [x] - darr_strlen_fixup
* [x] - darr_strnul
* [ ] - darr_vsprintf
*/
@@ -406,6 +407,9 @@ static void test_string(void)
assert(!strcmp(da1, "0123456789: DEADBEEF"));
assert(darr_strlen(da1) == 20);
assert(darr_cap(da1) == 128);
+
+ da1[5] = 0;
+ assert(darr_strlen_fixup(da1) == 5);
darr_free(da1);
da1 = darr_sprintf("0123456789: %08x", 0xDEADBEEF);