adapter: Fix crash when discovering
If client exits while start discovery command is pending it may produce
the following crash:
Invalid read of size 8
at 0x49036E: start_discovery_complete (adapter.c:1428)
by 0x4D4957: request_complete (mgmt.c:261)
by 0x4D5BD4: can_read_data (mgmt.c:353)
by 0x4E717A: watch_callback (io-glib.c:170)
by 0x50CEB76: g_main_context_dispatch (in /usr/lib64/libglib-2.0.so.0.5400.3)
by 0x50CEF1F: ??? (in /usr/lib64/libglib-2.0.so.0.5400.3)
by 0x50CF231: g_main_loop_run (in /usr/lib64/libglib-2.0.so.0.5400.3)
by 0x40CEC0: main (main.c:770)
Address 0x0 is not stack'd, malloc'd or (recently) free'd
diff --git a/src/adapter.c b/src/adapter.c
index fc4913e..8a99f52 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1425,7 +1425,7 @@
const void *param, void *user_data)
{
struct btd_adapter *adapter = user_data;
- struct watch_client *client = adapter->discovery_list->data;
+ struct watch_client *client;
const struct mgmt_cp_start_discovery *rp = param;
DBusMessage *reply;
@@ -1434,7 +1434,7 @@
/* Is there are no clients the discovery must have been stopped while
* discovery command was pending.
*/
- if (!client) {
+ if (!adapter->discovery_list) {
struct mgmt_cp_stop_discovery cp;
if (status != MGMT_STATUS_SUCCESS)
@@ -1448,6 +1448,8 @@
return;
}
+ client = adapter->discovery_list->data;
+
if (length < sizeof(*rp)) {
btd_error(adapter->dev_id,
"Wrong size of start discovery return parameters");