diff options
author | Samuel Valery <samuel.valery@digi.com> | 2024-03-14 07:54:38 +1000 |
---|---|---|
committer | Samuel Valery <samuel.valery@digi.com> | 2024-03-14 08:01:14 +1000 |
commit | ba9901e2be82189cd3dcb500b46527a0c0385fff (patch) | |
tree | f338f520403c58ab16d151a9088f415eaae33c99 | |
parent | 002179ca7fcd2a6b240802c89100b2cce9dc155b (diff) |
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
-rw-r--r-- | src/mm-bearer-qmi.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index 0083f486..50413475 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -2672,6 +2672,10 @@ reset_bearer_connection (MMBearerQmi *self, cleanup_event_report_unsolicited_events (self, self->priv->client_ipv4, &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; g_clear_object (&self->priv->client_ipv4); @@ -2688,6 +2692,10 @@ reset_bearer_connection (MMBearerQmi *self, cleanup_event_report_unsolicited_events (self, self->priv->client_ipv6, &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; g_clear_object (&self->priv->client_ipv6); |