tools: Fix memory leaks
authorSteve Grubb <sgrubb@redhat.com>
Fri, 14 May 2021 14:01:17 +0000 (10:01 -0400)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 11 Mar 2022 13:38:35 +0000 (19:08 +0530)
req is allocated memory that must be freed. It appears all other error
paths got fail which handles this.

g_new0 allocates memory to data which must be freed.

g_malloc0 allocates memory to comp which must be freed.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tools/mesh-cfgclient.c
tools/mesh-gatt/gatt.c
tools/mesh-gatt/node.c

index 99c3f9e..12b10d8 100644 (file)
@@ -916,7 +916,7 @@ static void cmd_import_node(int argc, char *argv[])
 
        /* Number of elements */
        if (sscanf(argv[4], "%u", &req->arg3) != 1)
-               return;
+               goto fail;
 
        /* DevKey */
        req->data2 = l_util_from_hexstring(argv[5], &sz);
index b99234f..c8a8123 100644 (file)
@@ -525,6 +525,7 @@ bool mesh_gatt_notify(GDBusProxy *proxy, bool enable, GDBusReturnFunction cb,
                        notify_io_destroy();
                        if (cb)
                                cb(NULL, user_data);
+                       g_free(data);
                        return true;
                } else {
                        method = "StopNotify";
index 6afda33..356e1cd 100644 (file)
@@ -396,8 +396,10 @@ bool node_parse_composition(struct mesh_node *node, uint8_t *data, uint16_t len)
                uint16_t vendor_id;
                struct mesh_element *ele;
                ele = g_malloc0(sizeof(struct mesh_element));
-               if (!ele)
+               if (!ele) {
+                       g_free(comp);
                        return false;
+               }
 
                ele->index = i;
                ele->loc = get_le16(data);
@@ -412,8 +414,10 @@ bool node_parse_composition(struct mesh_node *node, uint8_t *data, uint16_t len)
                        mod_id = get_le16(data);
                        /* initialize uppper 16 bits to 0xffff for SIG models */
                        mod_id |= 0xffff0000;
-                       if (!node_set_model(node, ele->index, mod_id))
+                       if (!node_set_model(node, ele->index, mod_id)) {
+                               g_free(comp);
                                return false;
+                       }
                        data += 2;
                        len -= 2;
                }
@@ -421,8 +425,10 @@ bool node_parse_composition(struct mesh_node *node, uint8_t *data, uint16_t len)
                        mod_id = get_le16(data + 2);
                        vendor_id = get_le16(data);
                        mod_id |= (vendor_id << 16);
-                       if (!node_set_model(node, ele->index, mod_id))
+                       if (!node_set_model(node, ele->index, mod_id)) {
+                               g_free(comp);
                                return false;
+                       }
                        data += 4;
                        len -= 4;
                }