summaryrefslogtreecommitdiff
path: root/obexd
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2015-09-10 17:56:25 +0300
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2015-09-14 10:12:30 +0300
commit95c09761fdee51279fe059b5071f8348439ce9d0 (patch)
tree04650a60d428cf7b302021946dd7c40026a35c53 /obexd
parent5cc4a1729b1473c1c00c947bbf119a78bc83647f (diff)
downloadbluez-95c09761fdee51279fe059b5071f8348439ce9d0.tar.gz
obexd: Fix not destroying session if owner disconnects
If the owner disconnects the session should be destroyed even if the connection is pending: obexd/client/session.c:owner_disconnected() obexd/client/session.c:obc_session_shutdown() 0x822abb8 obexd/client/session.c:obc_session_ref() 0x822abb8: ref=3 obexd/client/session.c:obc_session_unref() 0x822abb8: ref=2 obexd/client/bluetooth.c:transport_connect() port 19 obexd/client/bluetooth.c:transport_callback() obexd/client/session.c:transport_func() obexd/client/bluetooth.c:bluetooth_getpacketopt() obexd/client/pbap.c:pbap_probe() /org/bluez/obex/client/session1 obexd/client/session.c:obc_session_ref() 0x822abb8: ref=3 obexd/client/session.c:obc_session_register() Session(0x822abb8) registered /org/bluez/obex/client/session1 obexd/client/session.c:obc_session_unref() 0x822abb8: ref=2 To fix this the code now checks if the connect callback is pending, in that case destroy the callback releasing the reference it carrying.
Diffstat (limited to 'obexd')
-rw-r--r--obexd/client/session.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/obexd/client/session.c b/obexd/client/session.c
index d6da0a7fe..724876888 100644
--- a/obexd/client/session.c
+++ b/obexd/client/session.c
@@ -112,6 +112,7 @@ struct obc_session {
GQueue *queue;
guint process_id;
char *folder;
+ struct callback_data *callback;
};
static GSList *sessions = NULL;
@@ -303,6 +304,16 @@ disconnect:
session_free(session);
}
+static void callback_destroy(struct callback_data *callback, GError *err)
+{
+ struct obc_session *session = callback->session;
+
+ callback->func(session, NULL, err, callback->data);
+ g_free(callback);
+ session->callback = NULL;
+ obc_session_unref(session);
+}
+
static void connect_cb(GObex *obex, GError *err, GObexPacket *rsp,
gpointer user_data)
{
@@ -322,11 +333,9 @@ static void connect_cb(GObex *obex, GError *err, GObexPacket *rsp,
"OBEX Connect failed with 0x%02x", rsp_code);
done:
- callback->func(callback->session, NULL, gerr, callback->data);
+ callback_destroy(callback, gerr);
if (gerr != NULL)
g_error_free(gerr);
- obc_session_unref(callback->session);
- g_free(callback);
}
static void session_disconnected(GObex *obex, GError *err, gpointer user_data)
@@ -415,17 +424,28 @@ static void transport_func(GIOChannel *io, GError *err, gpointer user_data)
return;
done:
- callback->func(callback->session, NULL, err, callback->data);
- obc_session_unref(callback->session);
- g_free(callback);
+ callback_destroy(callback, err);
}
static void owner_disconnected(DBusConnection *connection, void *user_data)
{
struct obc_session *session = user_data;
+ GError *err;
DBG("");
+ /*
+ * If connection still connecting notify the callback to destroy the
+ * session.
+ */
+ if (session->callback) {
+ err = g_error_new(OBEX_IO_ERROR, OBEX_IO_DISCONNECTED,
+ "Session closed by user");
+ callback_destroy(session->callback, err);
+ g_error_free(err);
+ return;
+ }
+
obc_session_shutdown(session);
}
@@ -531,6 +551,8 @@ static int session_connect(struct obc_session *session,
return -EINVAL;
}
+ session->callback = callback;
+
return 0;
}