mm-bearer-qmi: Disconnect extended IP config handler

There exists code paths in which the IPv4 and IPv6 WDS extended IP
config indication signal handlers are not disconnected. This results in
a ModemManager crash when an indication signal handler callback is
invoked for a bearer that no longer exists. ModemManager crashes because
the callback function (extended_ip_config_indication_received) tries to
write a log and use the ID of a non-existent bearer.

This patch ensures the extended IP config signal handlers are
disconnected when the bearer connection is reset.

Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/794
This commit is contained in:
Samuel Valery
2024-03-14 08:01:14 +10:00
parent 002179ca7f
commit ba9901e2be
+8
View File
@@ -2672,6 +2672,10 @@ reset_bearer_connection (MMBearerQmi *self,
cleanup_event_report_unsolicited_events (self, cleanup_event_report_unsolicited_events (self,
self->priv->client_ipv4, self->priv->client_ipv4,
&self->priv->event_report_ipv4_indication_id); &self->priv->event_report_ipv4_indication_id);
if (self->priv->extended_ipv4_config_change_id) {
g_signal_handler_disconnect (self->priv->client_ipv4, self->priv->extended_ipv4_config_change_id);
self->priv->extended_ipv4_config_change_id = 0;
}
} }
self->priv->packet_data_handle_ipv4 = 0; self->priv->packet_data_handle_ipv4 = 0;
g_clear_object (&self->priv->client_ipv4); g_clear_object (&self->priv->client_ipv4);
@@ -2688,6 +2692,10 @@ reset_bearer_connection (MMBearerQmi *self,
cleanup_event_report_unsolicited_events (self, cleanup_event_report_unsolicited_events (self,
self->priv->client_ipv6, self->priv->client_ipv6,
&self->priv->event_report_ipv6_indication_id); &self->priv->event_report_ipv6_indication_id);
if (self->priv->extended_ipv6_config_change_id) {
g_signal_handler_disconnect (self->priv->client_ipv6, self->priv->extended_ipv6_config_change_id);
self->priv->extended_ipv6_config_change_id = 0;
}
} }
self->priv->packet_data_handle_ipv6 = 0; self->priv->packet_data_handle_ipv6 = 0;
g_clear_object (&self->priv->client_ipv6); g_clear_object (&self->priv->client_ipv6);