@@ -131,7 +131,6 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
131131{
132132 int levels ;
133133 int matched = 0 ;
134- cfl_sds_t found = NULL ;
135134 cfl_sds_t key = NULL ;
136135 struct cfl_variant * val = NULL ;
137136 struct cfl_kvpair * kvpair = NULL ;
@@ -142,6 +141,11 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
142141 /* Expected number of map levels in the map */
143142 levels = mk_list_size (subkeys );
144143
144+ /* Early return if no subkeys */
145+ if (levels == 0 ) {
146+ return -1 ;
147+ }
148+
145149 cur = * vobj ;
146150
147151 mk_list_foreach (head , subkeys ) {
@@ -157,14 +161,20 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
157161
158162 /* Index limit and ensure no overflow */
159163 if (entry -> array_id == INT_MAX ||
160- cfl_array_size (cur .data .as_array ) < entry -> array_id + 1 ) {
164+ entry -> array_id >= cfl_array_size (cur .data .as_array )) {
161165 return -1 ;
162166 }
163167
164168 val = cur .data .as_array -> entries [entry -> array_id ];
165169 cur = * val ;
166170 key = NULL ; /* fill NULL since the type is array. */
167- goto next ;
171+ matched ++ ;
172+
173+ if (levels == matched ) {
174+ break ;
175+ }
176+
177+ continue ;
168178 }
169179
170180 if (cur .type != CFL_VARIANT_KVLIST ) {
@@ -173,17 +183,13 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
173183
174184 kvpair = cfl_variant_kvpair_get (& cur , entry -> str );
175185 if (kvpair == NULL ) {
176- found = NULL ;
177- continue ;
186+ continue ; /* Try next entry */
178187 }
179188
180189 key = kvpair -> key ;
181190 val = kvpair -> val ;
182191
183- found = key ;
184192 cur = * val ;
185-
186- next :
187193 matched ++ ;
188194
189195 if (levels == matched ) {
@@ -192,7 +198,7 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
192198 }
193199
194200 /* No matches */
195- if (found == NULL || (matched > 0 && levels != matched )) {
201+ if (matched == 0 || (matched > 0 && levels != matched )) {
196202 return -1 ;
197203 }
198204
@@ -202,7 +208,6 @@ static int subkey_to_variant(struct cfl_variant *vobj, struct mk_list *subkeys,
202208 return 0 ;
203209}
204210
205-
206211struct flb_cfl_ra_value * flb_cfl_ra_key_to_value (flb_sds_t ckey ,
207212 struct cfl_variant vobj ,
208213 struct mk_list * subkeys )
0 commit comments