Skip to content

Commit 94f3007

Browse files
committed
Merge branch 'bugfix/fix_blufi_prepare_write_v5.0' into 'release/v5.0'
fix(blufi): Fixed crash issue in Blufi example during prepare write operation (v5.0) See merge request espressif/esp-idf!35713
2 parents 548ad60 + 1db0edd commit 94f3007

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

components/bt/common/btc/profile/esp/blufi/bluedroid_host/esp_blufi.c

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -160,20 +160,31 @@ static void blufi_profile_cb(tBTA_GATTS_EVT event, tBTA_GATTS *p_data)
160160
if (p_data->req_data.p_data->write_req.is_prep) {
161161
tBTA_GATT_STATUS status = GATT_SUCCESS;
162162

163-
if (blufi_env.prepare_buf == NULL) {
164-
blufi_env.prepare_buf = osi_malloc(BLUFI_PREPAIR_BUF_MAX_SIZE);
165-
blufi_env.prepare_len = 0;
166-
if (blufi_env.prepare_buf == NULL) {
167-
BLUFI_TRACE_ERROR("Blufi prep no mem\n");
168-
status = GATT_NO_RESOURCES;
163+
do {
164+
if (p_data->req_data.p_data->write_req.offset > BLUFI_PREPARE_BUF_MAX_SIZE) {
165+
status = ESP_GATT_INVALID_OFFSET;
166+
break;
169167
}
170-
} else {
171-
if (p_data->req_data.p_data->write_req.offset > BLUFI_PREPAIR_BUF_MAX_SIZE) {
172-
status = GATT_INVALID_OFFSET;
173-
} else if ((p_data->req_data.p_data->write_req.offset + p_data->req_data.p_data->write_req.len) > BLUFI_PREPAIR_BUF_MAX_SIZE) {
174-
status = GATT_INVALID_ATTR_LEN;
168+
169+
if ((p_data->req_data.p_data->write_req.offset + p_data->req_data.p_data->write_req.len) > BLUFI_PREPARE_BUF_MAX_SIZE) {
170+
status = ESP_GATT_INVALID_ATTR_LEN;
171+
break;
175172
}
176-
}
173+
174+
if (blufi_env.prepare_buf == NULL) {
175+
if (p_data->req_data.p_data->write_req.offset != 0) {
176+
status = GATT_INVALID_OFFSET;
177+
break;
178+
}
179+
blufi_env.prepare_buf = osi_malloc(BLUFI_PREPARE_BUF_MAX_SIZE);
180+
blufi_env.prepare_len = 0;
181+
if (blufi_env.prepare_buf == NULL) {
182+
BLUFI_TRACE_ERROR("Blufi prep no mem\n");
183+
status = GATT_NO_RESOURCES;
184+
break;
185+
}
186+
}
187+
} while (0);
177188

178189
memset(&rsp, 0, sizeof(tGATTS_RSP));
179190
rsp.attr_value.handle = p_data->req_data.p_data->write_req.handle;

components/bt/common/btc/profile/esp/blufi/include/blufi_int.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ typedef struct {
3636
UINT32 trans_id;
3737
UINT8 congest;
3838
UINT16 frag_size;
39+
// Deprecated: This macro will be removed in the future
3940
#define BLUFI_PREPAIR_BUF_MAX_SIZE 1024
41+
#define BLUFI_PREPARE_BUF_MAX_SIZE 1024
4042
uint8_t *prepare_buf;
4143
int prepare_len;
4244
/* Control reference */

0 commit comments

Comments
 (0)