Skip to content

Commit

Permalink
ra: fix cfl subkey_to_variant to support direct array access
Browse files Browse the repository at this point in the history
  • Loading branch information
niedbalski authored and edsiper committed Feb 28, 2025
1 parent e530ae8 commit 4a4e016
Showing 1 changed file with 15 additions and 10 deletions.
25 changes: 15 additions & 10 deletions src/flb_cfl_ra_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,6 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
{
int levels;
int matched = 0;
cfl_sds_t found = NULL;
cfl_sds_t key = NULL;
struct cfl_variant *val = NULL;
struct cfl_kvpair *kvpair = NULL;
Expand All @@ -142,6 +141,11 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
/* Expected number of map levels in the map */
levels = mk_list_size(subkeys);

/* Early return if no subkeys */
if (levels == 0) {
return -1;
}

cur = *vobj;

mk_list_foreach(head, subkeys) {
Expand All @@ -157,14 +161,20 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,

/* Index limit and ensure no overflow */
if (entry->array_id == INT_MAX ||
cfl_array_size(cur.data.as_array) < entry->array_id + 1) {
entry->array_id >= cfl_array_size(cur.data.as_array)) {
return -1;
}

val = cur.data.as_array->entries[entry->array_id];
cur = *val;
key = NULL; /* fill NULL since the type is array. */
goto next;
matched++;

if (levels == matched) {
break;
}

continue;
}

if (cur.type != CFL_VARIANT_KVLIST) {
Expand All @@ -173,17 +183,13 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,

kvpair = cfl_variant_kvpair_get(&cur, entry->str);
if (kvpair == NULL) {
found = NULL;
continue;
continue; /* Try next entry */
}

key = kvpair->key;
val = kvpair->val;

found = key;
cur = *val;

next:
matched++;

if (levels == matched) {
Expand All @@ -192,7 +198,7 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
}

/* No matches */
if (found == NULL || (matched > 0 && levels != matched)) {
if (matched == 0 || (matched > 0 && levels != matched)) {
return -1;
}

Expand All @@ -202,7 +208,6 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
return 0;
}


struct flb_cfl_ra_value *flb_cfl_ra_key_to_value(flb_sds_t ckey,
struct cfl_variant vobj,
struct mk_list *subkeys)
Expand Down

0 comments on commit 4a4e016

Please sign in to comment.