mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
lib: nb: fix bug with oper-state query on list data
The capacity of the xpath string was not guaranteed to be sufficient to hold all the key predicates and so would truncate. Calculate the required space and guarantee that it is available. Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
bd68a01d9a
commit
656c4692a0
|
@ -1723,8 +1723,9 @@ static enum nb_error __walk(struct nb_op_yield_state *ys, bool is_resume)
|
|||
*/
|
||||
len = darr_strlen(ys->xpath);
|
||||
if (ni->keys.num) {
|
||||
yang_get_key_preds(ys->xpath + len, sib,
|
||||
&ni->keys,
|
||||
darr_ensure_avail(ys->xpath,
|
||||
yang_get_key_pred_strlen(sib, &ni->keys) + 1);
|
||||
yang_get_key_preds(ys->xpath + len, sib, &ni->keys,
|
||||
darr_cap(ys->xpath) - len);
|
||||
} else {
|
||||
/* add a position predicate (1s based?) */
|
||||
|
|
16
lib/yang.c
16
lib/yang.c
|
@ -1357,9 +1357,21 @@ uint32_t yang_get_list_elements_count(const struct lyd_node *node)
|
|||
} while (node);
|
||||
return count;
|
||||
}
|
||||
int yang_get_key_pred_strlen(const struct lysc_node *snode, const struct yang_list_keys *keys)
|
||||
{
|
||||
const struct lysc_node_leaf *skey;
|
||||
size_t len = 0;
|
||||
size_t i = 0;
|
||||
|
||||
int yang_get_key_preds(char *s, const struct lysc_node *snode, const struct yang_list_keys *keys,
|
||||
ssize_t space)
|
||||
LY_FOR_KEYS (snode, skey) {
|
||||
/* [%s='%s'] */
|
||||
len += 5 + strlen(skey->name) + strlen(keys->key[i]);
|
||||
i++;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
int yang_get_key_preds(char *s, const struct lysc_node *snode, const struct yang_list_keys *keys, ssize_t space)
|
||||
{
|
||||
const struct lysc_node_leaf *skey;
|
||||
ssize_t len2, len = 0;
|
||||
|
|
|
@ -884,6 +884,10 @@ bool yang_is_last_level_dnode(const struct lyd_node *dnode);
|
|||
extern int yang_get_key_preds(char *s, const struct lysc_node *snode,
|
||||
const struct yang_list_keys *keys, ssize_t space);
|
||||
|
||||
/* Get the length of the predicate string based on the keys */
|
||||
extern int yang_get_key_pred_strlen(const struct lysc_node *snode,
|
||||
const struct yang_list_keys *keys);
|
||||
|
||||
/* Get YANG keys from an existing dnode */
|
||||
extern int yang_get_node_keys(struct lyd_node *node, struct yang_list_keys *keys);
|
||||
|
||||
|
|
Loading…
Reference in a new issue