Skip to content

Commit 5ef1b39

Browse files
committed
Merge branch 'fix/prov_ble_read_offset_v4.1' into 'release/v4.1'
BLE provisioning: Add check for valid ble read offset (v4.1) See merge request espressif/esp-idf!9745
2 parents bd72a9a + be13513 commit 5ef1b39

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

components/protocomm/src/transports/protocomm_ble.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,39 @@ static void transport_simple_ble_read(esp_gatts_cb_event_t event, esp_gatt_if_t
108108
{
109109
static const uint8_t *read_buf = NULL;
110110
static uint16_t read_len = 0;
111+
static uint16_t max_read_len = 0;
111112
esp_gatt_status_t status = ESP_OK;
112113

113114
ESP_LOGD(TAG, "Inside read w/ session - %d on param %d %d",
114115
param->read.conn_id, param->read.handle, read_len);
115116
if (!read_len && !param->read.offset) {
116117
ESP_LOGD(TAG, "Reading attr value first time");
117-
status = esp_ble_gatts_get_attr_value(param->read.handle, &read_len, &read_buf);
118+
status = esp_ble_gatts_get_attr_value(param->read.handle, &read_len, &read_buf);
119+
max_read_len = read_len;
120+
} else if ((read_len + param->read.offset) > max_read_len) {
121+
status = ESP_GATT_INVALID_OFFSET;
118122
} else {
119123
ESP_LOGD(TAG, "Subsequent read request for attr value");
120124
}
121125

122126
esp_gatt_rsp_t gatt_rsp = {0};
123-
gatt_rsp.attr_value.len = MIN(read_len, (protoble_internal->gatt_mtu - 1));
124127
gatt_rsp.attr_value.handle = param->read.handle;
125128
gatt_rsp.attr_value.offset = param->read.offset;
126-
gatt_rsp.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
127-
if (gatt_rsp.attr_value.len && read_buf) {
128-
memcpy(gatt_rsp.attr_value.value,
129-
read_buf + param->read.offset,
130-
gatt_rsp.attr_value.len);
129+
130+
if (status == ESP_GATT_OK) {
131+
gatt_rsp.attr_value.len = MIN(read_len, (protoble_internal->gatt_mtu - 1));
132+
gatt_rsp.attr_value.auth_req = ESP_GATT_AUTH_REQ_NONE;
133+
if (gatt_rsp.attr_value.len && read_buf) {
134+
memcpy(gatt_rsp.attr_value.value,
135+
read_buf + param->read.offset,
136+
gatt_rsp.attr_value.len);
137+
}
138+
read_len -= gatt_rsp.attr_value.len;
139+
} else {
140+
read_len = 0;
141+
max_read_len = 0;
142+
read_buf = NULL;
131143
}
132-
read_len -= gatt_rsp.attr_value.len;
133144
esp_err_t err = esp_ble_gatts_send_response(gatts_if, param->read.conn_id,
134145
param->read.trans_id, status, &gatt_rsp);
135146
if (err != ESP_OK) {

0 commit comments

Comments
 (0)