diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2012-01-17 17:17:30 +0200 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2012-01-17 17:17:30 +0200 |
commit | 1c990f90e7b80def0f132f99b74f3ffadaae60fe (patch) | |
tree | 0959c832c46740e3a110d2e66079751b25ea0724 /src/eir.c | |
parent | bc17659751eb5641911b49cd3b4c24530e476949 (diff) | |
download | bluez-1c990f90e7b80def0f132f99b74f3ffadaae60fe.tar.gz |
eir: Simplify parsing with clear helper variables
Diffstat (limited to 'src/eir.c')
-rw-r--r-- | src/eir.c | 29 |
1 files changed, 14 insertions, 15 deletions
@@ -120,7 +120,7 @@ int eir_parse(struct eir_data *eir, uint8_t *eir_data, uint8_t eir_len) while (len < eir_len - 1) { uint8_t field_len = eir_data[0]; - uint8_t name_len; + uint8_t data_len, *data = &eir_data[2]; /* Check for the end of EIR */ if (field_len == 0) @@ -134,50 +134,49 @@ int eir_parse(struct eir_data *eir, uint8_t *eir_data, uint8_t eir_len) return -EINVAL; } + data_len = field_len - 1; + switch (eir_data[1]) { case EIR_UUID16_SOME: case EIR_UUID16_ALL: - eir_parse_uuid16(eir, &eir_data[2], field_len); + eir_parse_uuid16(eir, data, data_len); break; case EIR_UUID32_SOME: case EIR_UUID32_ALL: - eir_parse_uuid32(eir, &eir_data[2], field_len); + eir_parse_uuid32(eir, data, data_len); break; case EIR_UUID128_SOME: case EIR_UUID128_ALL: - eir_parse_uuid128(eir, &eir_data[2], field_len); + eir_parse_uuid128(eir, data, data_len); break; case EIR_FLAGS: - eir->flags = eir_data[2]; + if (data_len > 0) + eir->flags = *data; break; case EIR_NAME_SHORT: case EIR_NAME_COMPLETE: /* Some vendors put a NUL byte terminator into * the name */ - name_len = field_len - 1; - - while (name_len > 0 && eir_data[name_len - 1] == '\0') - name_len--; + while (data_len > 0 && data[data_len - 1] == '\0') + data_len--; - if (!g_utf8_validate((char *) &eir_data[2], - name_len, NULL)) + if (!g_utf8_validate((char *) data, data_len, NULL)) break; g_free(eir->name); - eir->name = g_strndup((char *) &eir_data[2], - field_len - 1); + eir->name = g_strndup((char *) data, data_len); eir->name_complete = eir_data[1] == EIR_NAME_COMPLETE; break; case EIR_CLASS_OF_DEV: - if (field_len - 1 < 3) + if (data_len < 3) break; - memcpy(eir->dev_class, &eir_data[2], 3); + memcpy(eir->dev_class, data, 3); } eir_data += field_len + 1; |