diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2013-10-14 13:14:47 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2013-10-15 09:56:45 +0300 |
commit | b3b5fc6229ca283a0edca7e2c750274a5a60f555 (patch) | |
tree | fe8ce53182de4b60ab90fa5ed24e6304f62f59b6 /obexd | |
parent | fadaa8760c9d3366dbba40ccc3a11a83f8798445 (diff) |
obexd/session: Fix crash when transport is disconnected
When transport is disconnected unexpectedly it can cause the following
crash:
gobex-DEBUG: gobex/gobex.c:g_obex_send_internal() The transport is not connected
Invalid read of size 8
at 0x42662E: session_process_queue (session.c:789)
by 0x42668F: session_process (session.c:719)
by 0x3D46047E05: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x3D46048157: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x3D46048559: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x40D5FC: main (main.c:319)
Address 0x5086760 is 32 bytes inside a block of size 56 free'd
at 0x4A074C4: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x3D4604D9AE: g_free (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x426146: session_process_setpath (session.c:1063)
by 0x426629: session_process_queue (session.c:786)
by 0x42668F: session_process (session.c:719)
by 0x3D46047E05: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x3D46048157: ??? (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x3D46048559: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.3600.3)
by 0x40D5FC: main (main.c:319)
Diffstat (limited to 'obexd')
-rw-r--r-- | obexd/client/session.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/obexd/client/session.c b/obexd/client/session.c index 67c2b83fa..8138b1ecf 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -296,6 +296,16 @@ done: g_free(callback); } +static void session_disconnected(GObex *obex, GError *err, gpointer user_data) +{ + struct obc_session *session = user_data; + + if (err) + error("%s", err->message); + + obc_session_shutdown(session); +} + static void transport_func(GIOChannel *io, GError *err, gpointer user_data) { struct callback_data *callback = user_data; @@ -345,6 +355,8 @@ static void transport_func(GIOChannel *io, GError *err, gpointer user_data) session->obex = obex; sessions = g_slist_prepend(sessions, session); + g_obex_set_disconnect_function(obex, session_disconnected, session); + return; done: callback->func(callback->session, NULL, err, callback->data); |