plugins: fix GError double-frees when returning errors from tasks

Use g_steal_pointer() when passing g_autoptr(GError) to
g_task_return_error() to prevent double-free by the automatic cleanup.

GTask takes ownership of the passed GError. If we use g_autoptr(GError)
locally, it will also call g_error_free() when the function returns,
causing a double-free / heap corruption. Stealing the pointer clears the
local variable and prevents the automatic cleanup.

https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/work_items/1073

Signed-off-by: Aleksander Morgado <aleksandermj@google.com>
This commit is contained in:
Aleksander Morgado
2026-07-10 15:00:07 +02:00
committed by Aleksander Morgado
parent 166d6c5bc8
commit c3e7ffaae0
6 changed files with 10 additions and 10 deletions
@@ -1177,7 +1177,7 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *_self,
operator_code,
&command,
&error)) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -1723,14 +1723,14 @@ ws46_query_ready (MMBaseModem *self,
response = mm_base_modem_at_command_finish (self, res, &error);
if (!response) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
if (!mm_cinterion_parse_ws46_response (response,
&(result->allowed),
&error)) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -1882,7 +1882,7 @@ cops_set_current_modes (MMBroadbandModemCinterion *self,
operator_id,
&command,
&error)) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
+2 -2
View File
@@ -266,7 +266,7 @@ parent_load_update_settings_ready (MMIfaceModemFirmware *self,
priv = get_private (MM_SHARED_CINTERION (self));
update_settings = priv->iface_modem_firmware_parent->load_update_settings_finish (self, res, &error);
if (error) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -276,7 +276,7 @@ parent_load_update_settings_ready (MMIfaceModemFirmware *self,
ids = mm_iface_firmware_build_generic_device_ids (MM_IFACE_MODEM_FIRMWARE (self), &error);
if (error) {
mm_obj_warn (self, "failed to build generic device ids: %s", error->message);
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
+1 -1
View File
@@ -343,7 +343,7 @@ parent_load_update_settings_ready (MMIfaceModemFirmware *self,
priv = get_private (MM_SHARED_FIBOCOM (self));
update_settings = priv->iface_modem_firmware_parent->load_update_settings_finish (self, res, &error);
if (error) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -276,7 +276,7 @@ parent_load_update_settings_ready (MMIfaceModemFirmware *self,
update_settings = iface_modem_firmware_parent->load_update_settings_finish (self, res, &error);
if (error) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -212,7 +212,7 @@ power_off_ready (MMBroadbandModemQuectel *self,
*/
if (!mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error)) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
+1 -1
View File
@@ -485,7 +485,7 @@ parent_load_update_settings_ready (MMIfaceModemFirmware *self,
priv = get_private (MM_SHARED_QUECTEL (self));
update_settings = priv->iface_modem_firmware_parent->load_update_settings_finish (self, res, &error);
if (error) {
g_task_return_error (task, error);
g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}