]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Avoid memory leak on error when signaling PropertiesChanged
authorJouni Malinen <quic_jouni@quicinc.com>
Mon, 22 Jan 2024 15:14:53 +0000 (17:14 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 22 Jan 2024 19:16:47 +0000 (21:16 +0200)
put_changed_properties() might fail, e.g., due to memory allocation
failure or a failure in a property getter function. Such an error case
would have leaked the message iteration container since the call to
dbus_message_iter_close_container() would have been skipped.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
wpa_supplicant/dbus/dbus_new_helpers.c

index 7fb06699186507693b4b8938c0871290d580e450..28f1aa45d3f5f85d310afa541b3ce8e142ed1322 100644 (file)
@@ -671,20 +671,27 @@ static void do_send_prop_changed_signal(
                                            &interface) ||
            /* Changed properties dict */
            !dbus_message_iter_open_container(&signal_iter, DBUS_TYPE_ARRAY,
-                                             "{sv}", &dict_iter) ||
-           !put_changed_properties(obj_dsc, interface, &dict_iter, 0) ||
-           !dbus_message_iter_close_container(&signal_iter, &dict_iter) ||
+                                             "{sv}", &dict_iter))
+               goto fail;
+       if (!put_changed_properties(obj_dsc, interface, &dict_iter, 0)) {
+               dbus_message_iter_close_container(&signal_iter, &dict_iter);
+               goto fail;
+       }
+       if (!dbus_message_iter_close_container(&signal_iter, &dict_iter) ||
            /* Invalidated properties array (empty) */
            !dbus_message_iter_open_container(&signal_iter, DBUS_TYPE_ARRAY,
                                              "s", &dict_iter) ||
-           !dbus_message_iter_close_container(&signal_iter, &dict_iter)) {
-               wpa_printf(MSG_DEBUG, "dbus: %s: Failed to construct signal",
-                          __func__);
-       } else {
-               dbus_connection_send(con, msg, NULL);
-       }
+           !dbus_message_iter_close_container(&signal_iter, &dict_iter))
+               goto fail;
+
+       dbus_connection_send(con, msg, NULL);
 
+out:
        dbus_message_unref(msg);
+       return;
+fail:
+       wpa_printf(MSG_DEBUG, "dbus: %s: Failed to construct signal", __func__);
+       goto out;
 }
 
 
@@ -702,16 +709,23 @@ static void do_send_deprecated_prop_changed_signal(
        dbus_message_iter_init_append(msg, &signal_iter);
 
        if (!dbus_message_iter_open_container(&signal_iter, DBUS_TYPE_ARRAY,
-                                             "{sv}", &dict_iter) ||
-           !put_changed_properties(obj_dsc, interface, &dict_iter, 1) ||
-           !dbus_message_iter_close_container(&signal_iter, &dict_iter)) {
-               wpa_printf(MSG_DEBUG, "dbus: %s: Failed to construct signal",
-                          __func__);
-       } else {
-               dbus_connection_send(con, msg, NULL);
+                                             "{sv}", &dict_iter))
+               goto fail;
+       if (!put_changed_properties(obj_dsc, interface, &dict_iter, 1)) {
+               dbus_message_iter_close_container(&signal_iter, &dict_iter);
+               goto fail;
        }
+       if (!dbus_message_iter_close_container(&signal_iter, &dict_iter))
+               goto fail;
 
+       dbus_connection_send(con, msg, NULL);
+
+out:
        dbus_message_unref(msg);
+       return;
+fail:
+       wpa_printf(MSG_DEBUG, "dbus: %s: Failed to construct signal", __func__);
+       goto out;
 }