From 350e3ae05b6ddbc6f1be20adbbe3b5db5fa617a0 Mon Sep 17 00:00:00 2001
From: Pawel Wasowski
Date: Tue, 15 Sep 2020 17:24:04 +0200
Subject: [PATCH] [Bluetooth][Bugfix] Copy value we don't own before passing to
a worker
const char *remote_address is passed as an argument from
Native API to our callback, that adds a job to the Bluetooth's
worker.
Previously, the remote_address pointer was passed straight
to the worker. When referenced, it was already garbage.
This commit adds a copy of this value, so that the worker gets
proper data.
[Validation] Tested in Chrome DevTools. remoteAddress in JS is
a valid MAC address.
Change-Id: Id571296861775fee70d93ca94c4da0b496f9d3c8
Signed-off-by: Pawel Wasowski
---
src/bluetooth/bluetooth_gatt_server_service.cc | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/bluetooth/bluetooth_gatt_server_service.cc b/src/bluetooth/bluetooth_gatt_server_service.cc
index 8d0bc02a..bf07067a 100644
--- a/src/bluetooth/bluetooth_gatt_server_service.cc
+++ b/src/bluetooth/bluetooth_gatt_server_service.cc
@@ -449,13 +449,17 @@ PlatformResult BluetoothGATTServerService::SetReadValueRequestCallback(
remote_address, request_id, offset);
auto rw_callback_data = static_cast(user_data);
+ // We create a copy of this value, because remote_address pointer will be invalid
+ // when the job will be executed in the worker
+ auto remote_address_copy = std::string{remote_address};
+
rw_callback_data->instance_.GetWorker().add_job(
- [remote_address, request_id, server, gatt_handle, offset, rw_callback_data] {
+ [remote_address_copy, request_id, server, gatt_handle, offset, rw_callback_data] {
ScopeLogger("Async call: SetReadValueRequestCallback");
auto read_value_request = picojson::value{picojson::object{}};
auto& read_value_request_obj = read_value_request.get();
- read_value_request_obj[kClientAddress] = picojson::value{remote_address};
+ read_value_request_obj[kClientAddress] = picojson::value{remote_address_copy};
read_value_request_obj[kRequestId] = picojson::value{static_cast(request_id)};
read_value_request_obj[kRequestType] = picojson::value{kReadRequestType};
read_value_request_obj[kOffset] = picojson::value{static_cast(offset)};
--
2.34.1