<div dir="auto">lgtm</div><div class="gmail_extra"><br><div class="gmail_quote">On Aug 3, 2017 5:34 AM, "Aleksander Morgado" <<a href="mailto:aleksander@aleksander.es">aleksander@aleksander.es</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">When the device is gone while an open() operation is ongoing, we're<br>
completing and freeing the 'opening device info' struct, but we didn't<br>
remove it from the private info, so when device_open_ready() happened,<br>
we were trying to complete and free it again.<br>
<br>
Avoid this issue by making sure no already-freed structs are kept in<br>
the private info, and also allowing device_open_ready() to get called<br>
without a valid pending 'opening device info'.<br>
<br>
    [30 Jul 2017, 15:24:33] [Debug] [/dev/cdc-wdm0] Sent message (translated)...<br>
    <<<<<< Header:<br>
    <<<<<<   length      = 16<br>
    <<<<<<   type        = open (0x00000001)<br>
    <<<<<<   transaction = 1<br>
    <<<<<< Contents:<br>
    <<<<<<   max_control_transfer = 4096<br>
<br>
    [30 Jul 2017, 15:24:38] [Debug] [/dev/cdc-wdm0] Sent message...<br>
    <<<<<< RAW:<br>
    <<<<<<   length = 16<br>
    <<<<<<   data   = 01:00:00:00:10:00:00:00:02:00:<wbr>00:00:00:10:00:00<br>
<br>
    [30 Jul 2017, 15:24:38] [Debug] [/dev/cdc-wdm0] Sent message (translated)...<br>
    <<<<<< Header:<br>
    <<<<<<   length      = 16<br>
    <<<<<<   type        = open (0x00000001)<br>
    <<<<<<   transaction = 2<br>
    <<<<<< Contents:<br>
    <<<<<<   max_control_transfer = 4096<br>
<br>
    [30 Jul 2017, 15:24:42] [Debug] [/dev/cdc-wdm0] unexpected port hangup!<br>
    [30 Jul 2017, 15:24:42] [Debug] Client (7) connection closed...<br>
    [30 Jul 2017, 15:24:42] -Warning ** error opening device: Device is gone<br>
    [30 Jul 2017, 15:24:43] [Debug] open operation timed out: closed<br>
    ==24404== Invalid read of size 8<br>
    ==24404==    at 0x4E4A673: peek_opening_device_info (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x4E4BD7B: device_open_ready (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x50CAF61: g_simple_async_result_complete (in /usr/lib/libgio-2.0.so.0.3707.<wbr>0)<br>
    ==24404==    by 0x50CB028: complete_in_idle_cb (in /usr/lib/libgio-2.0.so.0.3707.<wbr>0)<br>
    ==24404==    by 0x5602EEA: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x5603207: g_main_context_iterate.isra.13 (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x56035D1: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x4010F8: main (in /usr/lib/mbim-proxy)<br>
    ==24404==  Address 0x6d3bfe0 is 0 bytes inside a block of size 16 free'd<br>
    ==24404==    at 0x4C2A0C0: free (in /usr/lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>
    ==24404==    by 0x4E4AC21: untrack_device (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x5395392: _g_closure_invoke_va (in /usr/lib/libgobject-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x53A805D: g_signal_emit_valist (in /usr/lib/libgobject-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x53A8A51: g_signal_emit (in /usr/lib/libgobject-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x4E49424: data_available (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x5602EEA: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x5603207: g_main_context_iterate.isra.13 (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x56035D1: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x4010F8: main (in /usr/lib/mbim-proxy)<br>
    ==24404==  Block was alloc'd at<br>
    ==24404==    at 0x4C2B3D0: malloc (in /usr/lib/valgrind/vgpreload_<wbr>memcheck-amd64-linux.so)<br>
    ==24404==    by 0x5607B00: g_malloc (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x5617E12: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x5618385: g_slice_alloc0 (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x4E4B1A9: internal_open (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x4E4BAC5: device_new_ready (in /usr/lib/libmbim-glib.so.4.2.<wbr>0)<br>
    ==24404==    by 0x50CAF61: g_simple_async_result_complete (in /usr/lib/libgio-2.0.so.0.3707.<wbr>0)<br>
    ==24404==    by 0x50CB028: complete_in_idle_cb (in /usr/lib/libgio-2.0.so.0.3707.<wbr>0)<br>
    ==24404==    by 0x5602EEA: g_main_context_dispatch (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x5603207: g_main_context_iterate.isra.13 (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x56035D1: g_main_loop_run (in /usr/lib/libglib-2.0.so.0.<wbr>3707.0)<br>
    ==24404==    by 0x4010F8: main (in /usr/lib/mbim-proxy)<br>
    ==24404==<br>
---<br>
<br>
Hey Ben & Dan,<br>
<br>
This updated patch introduces a helper complete_opening_device() that takes care of both removing the info from the list and freeing it. I believe it does look much cleaner indeed.<br>
<br>
What do you think?<br>
<br>
Cheers!<br>
<br>
---<br>
 src/libmbim-glib/mbim-proxy.c | 26 +++++++++++++++++---------<br>
 1 file changed, 17 insertions(+), 9 deletions(-)<br>
<br>
diff --git a/src/libmbim-glib/mbim-proxy.<wbr>c b/src/libmbim-glib/mbim-proxy.<wbr>c<br>
index fdbc7d9..d59a4de 100644<br>
--- a/src/libmbim-glib/mbim-proxy.<wbr>c<br>
+++ b/src/libmbim-glib/mbim-proxy.<wbr>c<br>
@@ -461,6 +461,21 @@ peek_opening_device_info (MbimProxy  *self,<br>
 }<br>
<br>
 static void<br>
+complete_opening_device (MbimProxy    *self,<br>
+                         MbimDevice   *device,<br>
+                         const GError *error)<br>
+{<br>
+    OpeningDevice *info;<br>
+<br>
+    info = peek_opening_device_info (self, device);<br>
+    if (!info)<br>
+        return;<br>
+<br>
+    self->priv->opening_devices = g_list_remove (self->priv->opening_devices, info);<br>
+    opening_device_complete_and_<wbr>free (info, error);<br>
+}<br>
+<br>
+static void<br>
 cancel_opening_device (MbimProxy  *self,<br>
                        MbimDevice *device)<br>
 {<br>
@@ -472,7 +487,7 @@ cancel_opening_device (MbimProxy  *self,<br>
         return;<br>
<br>
     error = g_error_new (MBIM_CORE_ERROR, MBIM_CORE_ERROR_ABORTED, "Device is gone");<br>
-    opening_device_complete_and_<wbr>free (info, error);<br>
+    complete_opening_device (self, device, error);<br>
     g_error_free (error);<br>
 }<br>
<br>
@@ -482,18 +497,11 @@ device_open_ready (MbimDevice   *device,<br>
                    MbimProxy    *self)<br>
 {<br>
     GError *error = NULL;<br>
-    OpeningDevice *info;<br>
<br>
     mbim_device_open_finish (device, res, &error);<br>
<br>
-    info = peek_opening_device_info (self, device);<br>
-    g_assert (info != NULL);<br>
-<br>
-    /* Remove opening device info */<br>
-    self->priv->opening_devices = g_list_remove (self->priv->opening_devices, info);<br>
-<br>
     /* Complete all pending open actions */<br>
-    opening_device_complete_and_<wbr>free (info, error);<br>
+    complete_opening_device (self, device, error);<br>
<br>
     if (error) {<br>
         /* Fully untrack the device as it wasn't correctly open */<br>
--<br>
2.13.1<br>
</blockquote></div></div>