Re: [PATCH 1/2] android/gatt: Fix find_info_handle function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday 11 of December 2014 13:06:59 Mariusz Skamra wrote:
> Server can contain attributes with 128-bit attribute types
> ---
>  android/gatt.c | 44 ++++++++++++++++++++++++++++++++++----------
>  1 file changed, 34 insertions(+), 10 deletions(-)
> 
> diff --git a/android/gatt.c b/android/gatt.c
> index 58bc22d..6d3bcd7 100644
> --- a/android/gatt.c
> +++ b/android/gatt.c
> @@ -6101,11 +6101,12 @@ static uint8_t find_info_handle(const uint8_t *cmd, uint16_t cmd_len,
>  						uint8_t *rsp, size_t rsp_size,
>  						uint16_t *length)
>  {
> -	struct queue *q;
> +	struct gatt_db_attribute *attrib;
> +	struct queue *q, *temp;
>  	struct att_data_list *adl;
>  	int iterator = 0;
>  	uint16_t start, end;
> -	uint16_t len;
> +	uint16_t len, queue_len;
>  
>  	DBG("");
>  
> @@ -6127,17 +6128,39 @@ static uint8_t find_info_handle(const uint8_t *cmd, uint16_t cmd_len,
>  		return ATT_ECODE_ATTR_NOT_FOUND;
>  	}
>  
> -	len = queue_length(q);
> -	adl = att_data_list_alloc(len, 2 * sizeof(uint16_t));
> -	if (!adl) {
> +	temp = queue_new();
> +	if (!temp) {
>  		queue_destroy(q, NULL);
> +		return ATT_ECODE_UNLIKELY;
> +	}
> +
> +	attrib = queue_peek_head(q);
> +	/* UUIDS can be only 128 bit and 16 bit */
> +	len = bt_uuid_len(gatt_db_attribute_get_type(attrib));
> +	if (len != 2 && len != 16) {
> +		queue_destroy(q, NULL);
> +		queue_destroy(temp, NULL);
> +		return ATT_ECODE_UNLIKELY;
> +	}
> +
> +	while (attrib && bt_uuid_len(gatt_db_attribute_get_type(attrib)) == len) {

This is over 80 characters. This might be hard to split so how about something
like this instead?

while (attrib) {
    const bt_uuid_t *type = gatt_db_attribute_get_type(attrib);

	if (bt_uuid_len(type) != len)
        break;

  ......

}


Also some comments would be nice about why we need another queue.

> +		queue_push_tail(temp, queue_pop_head(q));
> +		attrib = queue_peek_head(q);
> +	}
> +
> +	queue_destroy(q, NULL);
> +
> +	queue_len = queue_length(temp);
> +	adl = att_data_list_alloc(queue_len, len + sizeof(uint16_t));
> +	if (!adl) {
> +		queue_destroy(temp, NULL);
>  		return ATT_ECODE_INSUFF_RESOURCES;
>  	}
>  
> -	while (queue_peek_head(q)) {
> +	while (queue_peek_head(temp)) {
>  		uint8_t *value;
>  		const bt_uuid_t *type;
> -		struct gatt_db_attribute *attrib = queue_pop_head(q);
> +		struct gatt_db_attribute *attrib = queue_pop_head(temp);
>  		uint16_t handle;
>  
>  		type = gatt_db_attribute_get_type(attrib);
> @@ -6148,17 +6171,18 @@ static uint8_t find_info_handle(const uint8_t *cmd, uint16_t cmd_len,
>  
>  		handle = gatt_db_attribute_get_handle(attrib);
>  		put_le16(handle, value);
> -		memcpy(&value[2], &type->value.u16, bt_uuid_len(type));
> +		memcpy(&value[2], &type->value, len);
>  	}
>  
> -	len = enc_find_info_resp(ATT_FIND_INFO_RESP_FMT_16BIT, adl, rsp,
> +	len = enc_find_info_resp(len == 2 ? ATT_FIND_INFO_RESP_FMT_16BIT :
> +					ATT_FIND_INFO_RESP_FMT_128BIT, adl, rsp,
>  								rsp_size);
>  	if (!len)
>  		return ATT_ECODE_UNLIKELY;
>  
>  	*length = len;
>  	att_data_list_free(adl);
> -	queue_destroy(q, free);
> +	queue_destroy(temp, NULL);
>  
>  	return 0;
>  }
> 

-- 
Best regards, 
Szymon Janc
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux