summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2014-12-28 18:28:15 +0100
committerAleksander Morgado <aleksander@aleksander.es>2014-12-28 18:28:15 +0100
commit6be914e2801d2f091293b0686053b27198768815 (patch)
tree12be6d3a0c107c99e223971104a78d65eb22c029
parent68e3d695d331569c70d8c0a031852600a9a8174f (diff)
downloadlibmbim-6be914e2801d2f091293b0686053b27198768815.tar.gz
libmbim-glib,device: don't segfault if force-closed during message processing
(mbim-proxy:17046): GLib-CRITICAL **: g_byte_array_remove_range: assertion 'array' failed Program received signal SIGTRAP, Trace/breakpoint trap. 0x00007ffff7316ae0 in g_logv () from /usr/lib/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff7316ae0 in g_logv () from /usr/lib/libglib-2.0.so.0 #1 0x00007ffff7316d1f in g_log () from /usr/lib/libglib-2.0.so.0 #2 0x00007ffff72e49ba in g_byte_array_remove_range () from /usr/lib/libglib-2.0.so.0 #3 0x00007ffff7bb126d in parse_response (self=0x618100) at mbim-device.c:642 #4 0x00007ffff7bb151c in data_available (source=0x64ab60, condition=G_IO_IN, self=0x618100) at mbim-device.c:708 #5 0x00007ffff730f91d in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0 #6 0x00007ffff730fcf8 in ?? () from /usr/lib/libglib-2.0.so.0 #7 0x00007ffff7310022 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0 #8 0x000000000040153b in main (argc=1, argv=0x7fffffffeac8) at mbim-proxy.c:243 (gdb) fr 3 #3 0x00007ffff7bb126d in parse_response (self=0x618100) at mbim-device.c:642 642 g_byte_array_remove_range (self->priv->response, 0, in_length); (gdb) p self->priv->response $1 = (GByteArray *) 0x0
-rw-r--r--src/libmbim-glib/mbim-device.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/libmbim-glib/mbim-device.c b/src/libmbim-glib/mbim-device.c
index 12edf1c..babc3d9 100644
--- a/src/libmbim-glib/mbim-device.c
+++ b/src/libmbim-glib/mbim-device.c
@@ -638,6 +638,11 @@ parse_response (MbimDevice *self)
/* Play with the received message */
process_message (self, message);
+ /* If we were force-closed during the processing of a message, we'd be
+ * losing the response array directly, so check just in case */
+ if (!self->priv->response)
+ break;
+
/* Remove message from buffer */
g_byte_array_remove_range (self->priv->response, 0, in_length);
} while (self->priv->response->len > 0);