Fix crash in while setting the bluetooth name.
Bug: 3246147
Original change by: Johan Hedberg <johan.hedberg@nokia.com>
Fix local name handling
A name variable of 248 bytes can't be passed to functions that expect it
to be nul-terminated (since if the name is exactly 248 bytes it wont
be). This patch fixes the name to always be stored in a 249 byte
variable where the last byte is always zero.
Change-Id: I27cc2b936e628ebbaa43f6fe809396eeb3b1a8d1
diff --git a/src/adapter.c b/src/adapter.c
index 16334ec..b9e45b5 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -834,8 +834,7 @@
return;
if (dev->ssp_mode > 0)
- create_ext_inquiry_response((char *) dev->name,
- adapter->tx_power,
+ create_ext_inquiry_response(dev->name, adapter->tx_power,
adapter->services, data);
if (hci_write_ext_inquiry_response(dd, fec, data,
@@ -937,16 +936,16 @@
dev = &adapter->dev;
memcpy(&rp, ptr, MAX_NAME_LENGTH);
- if (strncmp((char *) rp.name, (char *) dev->name, MAX_NAME_LENGTH) == 0)
+ if (strncmp((char *) rp.name, dev->name, MAX_NAME_LENGTH) == 0)
return;
- strncpy((char *) dev->name, (char *) rp.name, MAX_NAME_LENGTH);
+ strncpy(dev->name, (char *) rp.name, MAX_NAME_LENGTH);
- write_local_name(bdaddr, (char *) dev->name);
+ write_local_name(bdaddr, dev->name);
update_ext_inquiry_response(adapter);
- name = g_strdup((char *) dev->name);
+ name = g_strdup(dev->name);
if (connection)
emit_property_changed(connection, adapter->path,
@@ -987,11 +986,11 @@
return invalid_args(msg);
}
- if (strncmp(name, (char *) dev->name, MAX_NAME_LENGTH) == 0)
+ if (strncmp(name, dev->name, MAX_NAME_LENGTH) == 0)
goto done;
if (!adapter->up) {
- strncpy((char *) adapter->dev.name, name, MAX_NAME_LENGTH);
+ strncpy(dev->name, name, MAX_NAME_LENGTH);
write_local_name(&adapter->bdaddr, name);
} else {
int err = adapter_ops->set_name(adapter->dev_id, name);
diff --git a/src/adapter.h b/src/adapter.h
index 8226514..9341118 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -69,7 +69,7 @@
uint16_t manufacturer;
uint8_t ssp_mode;
- uint8_t name[MAX_NAME_LENGTH];
+ char name[MAX_NAME_LENGTH + 1];
};
int adapter_start(struct btd_adapter *adapter);