CHROMIUM: broadband-modem-qmi: Fix crash on array free
Freeing the values of the array is not correct and causes a crash when
modemmanager is stopped. Cleanup the logic related to the creation and
disposing of the array.
BUG=b:189112803
TEST=restart modemmanager and check for crashes.
TEST=Run `tast run lazor network.ModemmanagerInhibitDevice` with and
without this fix, and see no crashes with the fix.
Change-Id: I587fdba9bebd6a4b5abf6c2ca0038bdc930d8556
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/modemmanager-next/+/2919179
Tested-by: Andrew Lassalle <andrewlassalle@chromium.org>
Commit-Queue: Andrew Lassalle <andrewlassalle@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Pavan Holla <pholla@google.com>
(cherry picked from commit 7efa220ad0a003b05613e3e75d8e2d79570b26dd)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/modemmanager-next/+/2926139
Auto-Submit: Andrew Lassalle <andrewlassalle@chromium.org>
Commit-Queue: Vincent Palatin <vpalatin@chromium.org>
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index eada6da..15f0e4b 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -8769,8 +8769,12 @@
return;
}
+ /* Resize array to match |current_list| */
+ g_array_set_size (self->priv->current_pdn_list, current_list->len);
+
mm_obj_dbg (self, "Found %u LTE attach PDNs defined", current_list->len);
for (i = 0; i < current_list->len; i++) {
+ g_array_index (self->priv->current_pdn_list, guint16, i) = g_array_index (current_list, guint16, i);
if (i == 0) {
self->priv->default_attach_pdn = g_array_index (current_list, guint16, i);
mm_obj_dbg (self, "Default LTE attach PDN profile: %u", self->priv->default_attach_pdn);
@@ -8778,11 +8782,6 @@
mm_obj_dbg (self, "Additional LTE attach PDN profile: %u", g_array_index (current_list, guint16, i));
}
- if (self->priv->current_pdn_list)
- g_array_free (self->priv->current_pdn_list, TRUE);
-
- self->priv->current_pdn_list = g_array_copy (current_list);
-
load_initial_eps_bearer_get_profile_settings (task, client);
}
@@ -10534,6 +10533,7 @@
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
MM_TYPE_BROADBAND_MODEM_QMI,
MMBroadbandModemQmiPrivate);
+ self->priv->current_pdn_list = g_array_new (FALSE, FALSE, sizeof (guint16));
}
static void
@@ -10549,6 +10549,9 @@
if (self->priv->supported_bands)
g_array_unref (self->priv->supported_bands);
+ if (self->priv->current_pdn_list)
+ g_array_free (self->priv->current_pdn_list, TRUE);
+
G_OBJECT_CLASS (mm_broadband_modem_qmi_parent_class)->finalize (object);
}
@@ -10573,9 +10576,6 @@
g_list_free_full (self->priv->firmware_list, g_object_unref);
self->priv->firmware_list = NULL;
- if (self->priv->current_pdn_list)
- g_array_free (self->priv->current_pdn_list, TRUE);
-
g_clear_object (&self->priv->current_firmware);
G_OBJECT_CLASS (mm_broadband_modem_qmi_parent_class)->dispose (object);