diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2014-12-28 18:28:15 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2014-12-28 18:28:15 +0100 |
commit | 6be914e2801d2f091293b0686053b27198768815 (patch) | |
tree | 12be6d3a0c107c99e223971104a78d65eb22c029 | |
parent | 68e3d695d331569c70d8c0a031852600a9a8174f (diff) | |
download | libmbim-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.c | 5 |
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); |