summaryrefslogtreecommitdiff
path: root/obexd
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2013-10-14 13:14:47 +0300
committerJohan Hedberg <johan.hedberg@intel.com>2013-10-15 09:56:45 +0300
commitb3b5fc6229ca283a0edca7e2c750274a5a60f555 (patch)
treefe8ce53182de4b60ab90fa5ed24e6304f62f59b6 /obexd
parentfadaa8760c9d3366dbba40ccc3a11a83f8798445 (diff)
downloadbluez-b3b5fc6229ca283a0edca7e2c750274a5a60f555.tar.gz
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.c12
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);