2014-12-10 13:31:19

by Mariusz Skamra

[permalink] [raw]
Subject: [PATCH] android/gatt: Fix missing error response to find by type value request

This patch fixes Find By Type Value Request issue.
When the attribute queue is empty, error response should be sent.
---
android/gatt.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/android/gatt.c b/android/gatt.c
index b2ce9c1..484775a 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -4546,7 +4546,6 @@ static void send_dev_complete_response(struct gatt_device *device,
if ((val->length != val->filter_vlen) ||
memcmp(val->value, val->filter_value,
val->length)) {
-
destroy_pending_request(val);
val = queue_pop_head(device->pending_requests);
continue;
@@ -6172,6 +6171,9 @@ static uint8_t find_by_type_request(const uint8_t *cmd, uint16_t cmd_len,
struct queue *q;
bt_uuid_t uuid;
uint16_t len;
+ size_t mtu;
+ uint8_t *rsp = g_attrib_get_buffer(device->attrib, &mtu);
+

DBG("");

@@ -6189,6 +6191,14 @@ static uint8_t find_by_type_request(const uint8_t *cmd, uint16_t cmd_len,

gatt_db_find_by_type(gatt_db, start, end, &uuid, q);

+ if (queue_isempty(q)) {
+ len = enc_error_resp(ATT_OP_FIND_BY_TYPE_REQ, start,
+ ATT_ECODE_ATTR_NOT_FOUND, rsp, mtu);
+ g_attrib_send(device->attrib, 0, rsp, len, NULL, NULL, NULL);
+ queue_destroy(q, NULL);
+ return 0;
+ }
+
while (queue_peek_head(q)) {
struct gatt_db_attribute *attrib = queue_pop_head(q);
struct pending_request *data;
--
1.9.1



2014-12-10 13:46:36

by Szymon Janc

[permalink] [raw]
Subject: Re: [PATCH] android/gatt: Fix missing error response to find by type value request

Hi Mariusz,

On Wednesday 10 of December 2014 14:31:19 Mariusz Skamra wrote:
> This patch fixes Find By Type Value Request issue.
> When the attribute queue is empty, error response should be sent.
> ---
> android/gatt.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/android/gatt.c b/android/gatt.c
> index b2ce9c1..484775a 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -4546,7 +4546,6 @@ static void send_dev_complete_response(struct
> gatt_device *device, if ((val->length != val->filter_vlen) ||
> memcmp(val->value, val->filter_value,
> val->length)) {
> -

Coding style fixes should be in separate patch.

> destroy_pending_request(val);
> val = queue_pop_head(device->pending_requests);
> continue;
> @@ -6172,6 +6171,9 @@ static uint8_t find_by_type_request(const uint8_t
> *cmd, uint16_t cmd_len, struct queue *q;
> bt_uuid_t uuid;
> uint16_t len;
> + size_t mtu;
> + uint8_t *rsp = g_attrib_get_buffer(device->attrib, &mtu);
> +
>

Double empty line.

> DBG("");
>
> @@ -6189,6 +6191,14 @@ static uint8_t find_by_type_request(const uint8_t
> *cmd, uint16_t cmd_len,
>
> gatt_db_find_by_type(gatt_db, start, end, &uuid, q);
>
> + if (queue_isempty(q)) {

You could also move mtu and rsp declarations here.

> + len = enc_error_resp(ATT_OP_FIND_BY_TYPE_REQ, start,
> + ATT_ECODE_ATTR_NOT_FOUND, rsp, mtu);
> + g_attrib_send(device->attrib, 0, rsp, len, NULL, NULL, NULL);
> + queue_destroy(q, NULL);
> + return 0;
> + }
> +
> while (queue_peek_head(q)) {
> struct gatt_db_attribute *attrib = queue_pop_head(q);
> struct pending_request *data;

--
BR
Szymon Janc