Ensure deserialize_dbus_signal_event doesn't leak data 53/318853/2
authorMateusz Majewski <m.majewski2@samsung.com>
Mon, 27 Jan 2025 15:52:20 +0000 (16:52 +0100)
committerMateusz Majewski <m.majewski2@samsung.com>
Mon, 27 Jan 2025 16:05:31 +0000 (17:05 +0100)
This fixes some Coverity issues.

Change-Id: I0d1f7f58fa1805861efdd398f4574f4237919153

src/event_types/dbus_signal_event.c

index c55688005cc25ae8b906a58604ef908db6a91e59..29a22c3619c4ee1a058c86987167299b15e62ffa 100644 (file)
@@ -70,24 +70,43 @@ static int deserialize_dbus_signal_event(struct epc_event_type *type,
                        if (!strcmp(DS_EV_TIME, obj->key))
                                ds_ev_data.event_time = obj->val.time;
                        break;
+               /* In the following cases, we assume that the key might incorrectly
+                * repeat, and so we free the previous data in that case. In practice
+                * the key should not repeat. This will not happen if our serializer is
+                * used (see function dbus_signal_event_serialize), but the data comes
+                * from a database using a pluggable interface, with no explicit
+                * assumption that the data can be trusted. At the same time, the only
+                * implementation is a NOP database which will never actually return
+                * an event, so it seems that this function does not have this issue
+                * (since it will never be called). */
                case TYPE_STRING:
-                       if (!strcmp(DS_EV_ID, obj->key))
+                       if (!strcmp(DS_EV_ID, obj->key)) {
+                               free(ds_ev_data.event_id);
                                ds_ev_data.event_id = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_SENDER, obj->key))
+                       } else if (!strcmp(DS_EV_SENDER, obj->key)) {
+                               free(ds_ev_data.sender);
                                ds_ev_data.sender = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_INTERFACE, obj->key))
+                       } else if (!strcmp(DS_EV_INTERFACE, obj->key)) {
+                               free(ds_ev_data.interface);
                                ds_ev_data.interface = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_MEMBER, obj->key))
+                       } else if (!strcmp(DS_EV_MEMBER, obj->key)) {
+                               free(ds_ev_data.member);
                                ds_ev_data.member = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_PATH, obj->key))
+                       } else if (!strcmp(DS_EV_PATH, obj->key)) {
+                               free(ds_ev_data.path);
                                ds_ev_data.path = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_PATH_NAMESPACE, obj->key))
+                       } else if (!strcmp(DS_EV_PATH_NAMESPACE, obj->key)) {
+                               free(ds_ev_data.path_namespace);
                                ds_ev_data.path_namespace = strdup(obj->val.s);
-                       else if (!strcmp(DS_EV_DESTINATION, obj->key))
+                       } else if (!strcmp(DS_EV_DESTINATION, obj->key)) {
+                               free(ds_ev_data.destination);
                                ds_ev_data.destination = strdup(obj->val.s);
+                       }
                        break;
                case TYPE_OBJECT:
                        if (!strcmp(DS_EV_PARAMS, obj->key)) {
+                               if (ds_ev_data.match_params)
+                                       epc_object_unref(ds_ev_data.match_params);
                                epc_object_ref(obj);
                                ds_ev_data.match_params = obj;
                        }