2018-01-18 16:37:53

by Szymon Janc

[permalink] [raw]
Subject: [PATCH] device: Fix Connect and ConnectProfile returing InProgress error

Calling Connect or ConnectProfile for device without resolved services
results in doing SDP browse first. After search is complete code was
suppose to continue with profile connection but was always returning
"InProgress" error due to browsing request not being cleared yet.
---
src/device.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/src/device.c b/src/device.c
index 72f18b309..1acecce33 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2230,6 +2230,7 @@ static void browse_request_complete(struct browse_req *req, uint8_t type,
{
struct btd_device *dev = req->device;
DBusMessage *reply = NULL;
+ DBusMessage *msg;

if (req->type != type)
return;
@@ -2266,19 +2267,31 @@ static void browse_request_complete(struct browse_req *req, uint8_t type,
goto done;
}

- if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE, "Connect"))
- reply = dev_connect(dbus_conn, req->msg, dev);
- else if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,
+ /* if successfully resolved services we need to free browsing request
+ * before passing message back to connect functions, otherwise
+ * device->browse is set and "InProgress" error is returned instead
+ * of actually connecting services
+ */
+ msg = dbus_message_ref(req->msg);
+ browse_request_free(req);
+ req = NULL;
+
+ if (dbus_message_is_method_call(msg, DEVICE_INTERFACE, "Connect"))
+ reply = dev_connect(dbus_conn, msg, dev);
+ else if (dbus_message_is_method_call(msg, DEVICE_INTERFACE,
"ConnectProfile"))
- reply = connect_profile(dbus_conn, req->msg, dev);
+ reply = connect_profile(dbus_conn, msg, dev);
else
- reply = g_dbus_create_reply(req->msg, DBUS_TYPE_INVALID);
+ reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+
+ dbus_message_unref(msg);

done:
if (reply)
g_dbus_send_message(dbus_conn, reply);

- browse_request_free(req);
+ if (req)
+ browse_request_free(req);
}

static void device_set_svc_refreshed(struct btd_device *device, bool value)
--
2.14.3



2018-01-19 13:33:35

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH] device: Fix Connect and ConnectProfile returing InProgress error

On Thursday, 18 January 2018 17:37:53 CET Szymon Janc wrote:
> Calling Connect or ConnectProfile for device without resolved services
> results in doing SDP browse first. After search is complete code was
> suppose to continue with profile connection but was always returning
> "InProgress" error due to browsing request not being cleared yet.
> ---
> src/device.c | 25 +++++++++++++++++++------
> 1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/src/device.c b/src/device.c
> index 72f18b309..1acecce33 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -2230,6 +2230,7 @@ static void browse_request_complete(struct browse_req
> *req, uint8_t type, {
> struct btd_device *dev = req->device;
> DBusMessage *reply = NULL;
> + DBusMessage *msg;
>
> if (req->type != type)
> return;
> @@ -2266,19 +2267,31 @@ static void browse_request_complete(struct
> browse_req *req, uint8_t type, goto done;
> }
>
> - if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE, "Connect"))
> - reply = dev_connect(dbus_conn, req->msg, dev);
> - else if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,
> + /* if successfully resolved services we need to free browsing request
> + * before passing message back to connect functions, otherwise
> + * device->browse is set and "InProgress" error is returned instead
> + * of actually connecting services
> + */
> + msg = dbus_message_ref(req->msg);
> + browse_request_free(req);
> + req = NULL;
> +
> + if (dbus_message_is_method_call(msg, DEVICE_INTERFACE, "Connect"))
> + reply = dev_connect(dbus_conn, msg, dev);
> + else if (dbus_message_is_method_call(msg, DEVICE_INTERFACE,
> "ConnectProfile"))
> - reply = connect_profile(dbus_conn, req->msg, dev);
> + reply = connect_profile(dbus_conn, msg, dev);
> else
> - reply = g_dbus_create_reply(req->msg, DBUS_TYPE_INVALID);
> + reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
> +
> + dbus_message_unref(msg);
>
> done:
> if (reply)
> g_dbus_send_message(dbus_conn, reply);
>
> - browse_request_free(req);
> + if (req)
> + browse_request_free(req);
> }
>
> static void device_set_svc_refreshed(struct btd_device *device, bool value)

Applied.

--
pozdrawiam
Szymon Janc