From e3bebc85c44f4d7826a2c4cdef937b33aeceb329 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 27 Feb 2014 13:03:04 -0600 Subject: libmm-glib: deep-copy ports array in ensure_internal_ports() (bgo #724900) ensure_internal_ports() didn't deep-copy the ports array, which meant that anything calling mm_modem_port_info_array_free() was freeing the internal memory owned by MMModem if it retrieved the array with mm_modem_get_ports(). https://bugzilla.gnome.org/show_bug.cgi?id=724900 --- libmm-glib/mm-modem.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'libmm-glib/mm-modem.c') diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c index 213f679d..3274a44f 100644 --- a/libmm-glib/mm-modem.c +++ b/libmm-glib/mm-modem.c @@ -752,6 +752,7 @@ ensure_internal_ports (MMModem *self, guint *dup_ports_n) { gboolean ret; + guint i; g_mutex_lock (&self->priv->ports_mutex); { @@ -783,7 +784,15 @@ ensure_internal_ports (MMModem *self, *dup_ports_n = self->priv->ports->len; if (self->priv->ports->len > 0) { *dup_ports = g_malloc (sizeof (MMModemPortInfo) * self->priv->ports->len); - memcpy (*dup_ports, self->priv->ports->data, sizeof (MMModemPortInfo) * self->priv->ports->len); + + /* Deep-copy the array */ + for (i = 0; i < self->priv->ports->len; i++) { + MMModemPortInfo *dst = &(*dup_ports)[i]; + MMModemPortInfo *src = &g_array_index (self->priv->ports, MMModemPortInfo, i); + + dst->name = g_strdup (src->name); + dst->type = src->type; + } } else *dup_ports = NULL; } @@ -795,7 +804,7 @@ ensure_internal_ports (MMModem *self, } /** - * mm_modem_peek_current_ports: + * mm_modem_peek_ports: * @self: A #MMModem. * @ports: (out) (array length=n_ports) (transfer none): Return location for the array of #MMModemPortInfo values. Do not free the returned value, it is owned by @self. * @n_ports: (out): Return location for the number of values in @ports. -- cgit v1.2.3-70-g09d2