vppapigen: more _fromjson autogeneration coverity fixes 12/31312/2
authorOle Troan <ot@cisco.com>
Tue, 16 Feb 2021 17:09:51 +0000 (18:09 +0100)
committerNeale Ranns <neale@graphiant.com>
Wed, 17 Feb 2021 08:08:08 +0000 (08:08 +0000)
Type: fix
Signed-off-by: Ole Troan <ot@cisco.com>
Change-Id: I9a7bb617a3fa87d6ef49c75277e53425310cdcf9
Signed-off-by: Ole Troan <ot@cisco.com>
src/tools/vppapigen/vppapigen_c.py
src/vat2/jsonconvert.c
src/vat2/test/vat2_test.api
src/vat2/test/vat2_test.c

index 9b16413..759d332 100644 (file)
@@ -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):
index fa41e79..d62cda1 100644 (file)
@@ -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;
index 5896147..afc8afa 100644 (file)
@@ -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;
+};
index f28bb41..89714c4 100644 (file)
@@ -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)