2011-10-20 12:53:04

by Frederic Danis

[permalink] [raw]
Subject: [PATCH v3] Simplify eir_parse_uuid* functions

---
src/eir.c | 37 +++++++++++++++----------------------
1 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/src/eir.c b/src/eir.c
index f188031..88a4807 100644
--- a/src/eir.c
+++ b/src/eir.c
@@ -59,43 +59,33 @@ void eir_data_free(struct eir_data *eir)
eir->name = NULL;
}

-static void eir_parse_uuid16(struct eir_data *eir, uint8_t *data, uint8_t len)
+static void eir_parse_uuid16(struct eir_data *eir, void *data, uint8_t len)
{
- uint8_t *uuid_ptr = data;
+ uint16_t *uuid16 = data;
uuid_t service;
char *uuid_str;
unsigned int i;
- uint16_t val16;

service.type = SDP_UUID16;
- for (i = 0; i < len / 2; i++) {
- val16 = uuid_ptr[1];
- val16 = (val16 << 8) + uuid_ptr[0];
- service.value.uuid16 = val16;
+ for (i = 0; i < len / 2; i++, uuid16++) {
+ service.value.uuid16 = btohs(bt_get_unaligned(uuid16));
uuid_str = bt_uuid2string(&service);
eir->services = g_slist_append(eir->services, uuid_str);
- uuid_ptr += 2;
}
}

-static void eir_parse_uuid32(struct eir_data *eir, uint8_t *data, uint8_t len)
+static void eir_parse_uuid32(struct eir_data *eir, void *data, uint8_t len)
{
- uint8_t *uuid_ptr = data;
+ uint32_t *uuid32 = data;
uuid_t service;
char *uuid_str;
unsigned int i;
- uint32_t val32;
- int k;

service.type = SDP_UUID32;
- for (i = 0; i < len / 4; i++) {
- val32 = uuid_ptr[3];
- for (k = 2; k >= 0; k--)
- val32 = (val32 << 8) + uuid_ptr[k];
- service.value.uuid32 = val32;
+ for (i = 0; i < len / 4; i++, uuid32++) {
+ service.value.uuid32 = btohl(bt_get_unaligned(uuid32));
uuid_str = bt_uuid2string(&service);
eir->services = g_slist_append(eir->services, uuid_str);
- uuid_ptr += 4;
}
}

@@ -164,12 +154,15 @@ int eir_parse(struct eir_data *eir, uint8_t *eir_data)

case EIR_NAME_SHORT:
case EIR_NAME_COMPLETE:
- if (g_utf8_validate((char *) &eir_data[2],
+ if (!g_utf8_validate((char *) &eir_data[2],
field_len - 1, NULL))
- eir->name = g_strndup((char *) &eir_data[2],
+ break;
+
+ if (eir->name)
+ g_free(eir->name);
+
+ eir->name = g_strndup((char *) &eir_data[2],
field_len - 1);
- else
- eir->name = g_strdup("");
eir->name_complete = eir_data[1] == EIR_NAME_COMPLETE;
break;
}
--
1.7.1



2011-10-21 08:15:25

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH v3] Simplify eir_parse_uuid* functions

Hi Fr?d?ric,

On Thu, Oct 20, 2011, Fr?d?ric Danis wrote:
> ---
> src/eir.c | 37 +++++++++++++++----------------------
> 1 files changed, 15 insertions(+), 22 deletions(-)

I made the g_free fix suggestion from Lizardo and applied the patch.
Thanks.

Johan

2011-10-20 20:27:30

by Anderson Lizardo

[permalink] [raw]
Subject: Re: [PATCH v3] Simplify eir_parse_uuid* functions

Hi Fr?d?ric,

2011/10/20 Fr?d?ric Danis <[email protected]>:
> + ? ? ? ? ? ? ? ? ? ? ? if (eir->name)
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? g_free(eir->name);

You don't need to check for NULL before passing a pointer to g_free().
IMHO just "g_free(eir->name)" is clearer.

> +
> + ? ? ? ? ? ? ? ? ? ? ? eir->name = g_strndup((char *) &eir_data[2],
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?field_len - 1);
> - ? ? ? ? ? ? ? ? ? ? ? else
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? eir->name = g_strdup("");
> ? ? ? ? ? ? ? ? ? ? ? ?eir->name_complete = eir_data[1] == EIR_NAME_COMPLETE;
> ? ? ? ? ? ? ? ? ? ? ? ?break;

Regards,
--
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil