From 93c4b1bb3f9c9e3871d51b0fd52d935555df2521 Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Tue, 16 Feb 2021 18:09:51 +0100 Subject: [PATCH] vppapigen: more _fromjson autogeneration coverity fixes Type: fix Signed-off-by: Ole Troan Change-Id: I9a7bb617a3fa87d6ef49c75277e53425310cdcf9 Signed-off-by: Ole Troan --- src/tools/vppapigen/vppapigen_c.py | 16 ++++++++++------ src/vat2/jsonconvert.c | 3 ++- src/vat2/test/vat2_test.api | 13 +++++++++++++ src/vat2/test/vat2_test.c | 20 ++++++++++++++++++++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/tools/vppapigen/vppapigen_c.py b/src/tools/vppapigen/vppapigen_c.py index 9b16413f6d4..759d3325056 100644 --- a/src/tools/vppapigen/vppapigen_c.py +++ b/src/tools/vppapigen/vppapigen_c.py @@ -416,7 +416,7 @@ class FromJSON(): if o.lengthfield: write(' s = u8string_fromjson(o, "{}");\n' .format(o.fieldname)) - write(' if (!s) return 0;\n') + write(' if (!s) goto error;\n') write(' {} = vec_len(s);\n'.format(lfield)) write(' {realloc} = realloc({realloc}, {msgsize} + ' @@ -427,7 +427,7 @@ class FromJSON(): write(' vec_free(s);\n') else: - write(' u8string_fromjson2(o, "{n}", a->{n});\n' + write(' if (u8string_fromjson2(o, "{n}", a->{n}) < 0) goto error;\n' .format(n=o.fieldname)) return @@ -438,7 +438,7 @@ class FromJSON(): call = ('vl_api_{t}_fromjson(e, &d[i]);' .format(t=o.fieldtype)) else: - call = ('{t}_fromjson({msgvar}, len, e, &d[i]); ' + call = ('if ({t}_fromjson({msgvar}, len, e, &d[i]) < 0) goto error; ' .format(t=o.fieldtype, msgvar=msgvar)) write(forloop_vla.format(lfield=lfield, t=o.fieldtype, @@ -547,6 +547,7 @@ class FromJSON(): def print_define(self, o): '''Convert JSON object to VPP API message''' write = self.stream.write + error = 0 write('static inline vl_api_{name}_t *vl_api_{name}_t_fromjson ' '(cJSON *o, int *len) {{\n'.format(name=o.name)) write(' cJSON *item __attribute__ ((unused));\n') @@ -563,14 +564,17 @@ class FromJSON(): write(' item = cJSON_GetObjectItem(o, "{}");\n' .format(t.fieldname)) write(' if (!item) goto error;\n') + error += 1 self._dispatch[t.type](self, t, toplevel=True) write('\n') write(' *len = l;\n') write(' return a;\n') - write('\n error:\n') - write(' free(a);\n') - write(' return 0;\n') + + if error: + write('\n error:\n') + write(' free(a);\n') + write(' return 0;\n') write('}\n') def print_using(self, o): diff --git a/src/vat2/jsonconvert.c b/src/vat2/jsonconvert.c index fa41e7988e2..d62cda1091c 100644 --- a/src/vat2/jsonconvert.c +++ b/src/vat2/jsonconvert.c @@ -69,7 +69,8 @@ int u8string_fromjson2(cJSON *o, char *fieldname, u8 *data) { u8 *s = u8string_fromjson(o, fieldname); - if (!s) return 0; + if (!s) + return -1; memcpy(data, s, vec_len(s)); vec_free(s); return 0; diff --git a/src/vat2/test/vat2_test.api b/src/vat2/test/vat2_test.api index 58961475e30..afc8afa4dd7 100644 --- a/src/vat2/test/vat2_test.api +++ b/src/vat2/test/vat2_test.api @@ -81,3 +81,16 @@ autoreply define test_vla5 { autoreply define test_addresses { vl_api_address_t a; }; +autoreply define test_addresses2 { + vl_api_address_t a[2]; +}; +autoreply define test_addresses3 { + u32 n; + vl_api_address_t a[n]; +}; + +/* Empty */ +autoreply define test_empty { + u32 client_index; + u32 context; +}; diff --git a/src/vat2/test/vat2_test.c b/src/vat2/test/vat2_test.c index f28bb414d56..89714c4f992 100644 --- a/src/vat2/test/vat2_test.c +++ b/src/vat2/test/vat2_test.c @@ -147,6 +147,21 @@ struct msgs msgs[] = { .tojson = (tojson_fn_t) vl_api_test_addresses_t_tojson, .fromjson = (fromjson_fn_t) vl_api_test_addresses_t_fromjson, }, + { + .name = "test_addresses2", + .tojson = (tojson_fn_t) vl_api_test_addresses2_t_tojson, + .fromjson = (fromjson_fn_t) vl_api_test_addresses2_t_fromjson, + }, + { + .name = "test_addresses3", + .tojson = (tojson_fn_t) vl_api_test_addresses3_t_tojson, + .fromjson = (fromjson_fn_t) vl_api_test_addresses3_t_fromjson, + }, + { + .name = "test_empty", + .tojson = (tojson_fn_t) vl_api_test_empty_t_tojson, + .fromjson = (fromjson_fn_t) vl_api_test_empty_t_fromjson, + }, }; struct tests tests[] = { @@ -170,6 +185,11 @@ struct tests tests[] = { "\"0xaabbccddee\" }}" }, { .s = "{\"_msgname\": \"test_addresses\", \"a\": \"1.2.3.4\" }" }, { .s = "{\"_msgname\": \"test_addresses\", \"a\": \"2001:db8::23\" }" }, + { .s = "{\"_msgname\": \"test_addresses2\", \"a\": [\"2001:db8::23\", " + "\"2001:db8::23\"] }" }, + { .s = "{\"_msgname\": \"test_addresses3\", \"n\": 2, \"a\": " + "[\"2001:db8::23\", \"2001:db8::23\"] }" }, + { .s = "{\"_msgname\": \"test_empty\"}" }, }; int main (int argc, char **argv) -- 2.16.6