aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2021-02-16 18:09:51 +0100
committerNeale Ranns <neale@graphiant.com>2021-02-17 08:08:08 +0000
commit93c4b1bb3f9c9e3871d51b0fd52d935555df2521 (patch)
treeb326a99ae54715b36aea37bdb81cab6c7e319345 /src
parent0a5b4c3fbfa1ec0699bc21b12a984836aadaa442 (diff)
vppapigen: more _fromjson autogeneration coverity fixes
Type: fix Signed-off-by: Ole Troan <ot@cisco.com> Change-Id: I9a7bb617a3fa87d6ef49c75277e53425310cdcf9 Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'src')
-rw-r--r--src/tools/vppapigen/vppapigen_c.py16
-rw-r--r--src/vat2/jsonconvert.c3
-rw-r--r--src/vat2/test/vat2_test.api13
-rw-r--r--src/vat2/test/vat2_test.c20
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)