@@ -108,28 +108,39 @@ static void transport_simple_ble_read(esp_gatts_cb_event_t event, esp_gatt_if_t
108
108
{
109
109
static const uint8_t * read_buf = NULL ;
110
110
static uint16_t read_len = 0 ;
111
+ static uint16_t max_read_len = 0 ;
111
112
esp_gatt_status_t status = ESP_OK ;
112
113
113
114
ESP_LOGD (TAG , "Inside read w/ session - %d on param %d %d" ,
114
115
param -> read .conn_id , param -> read .handle , read_len );
115
116
if (!read_len && !param -> read .offset ) {
116
117
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 ;
118
122
} else {
119
123
ESP_LOGD (TAG , "Subsequent read request for attr value" );
120
124
}
121
125
122
126
esp_gatt_rsp_t gatt_rsp = {0 };
123
- gatt_rsp .attr_value .len = MIN (read_len , (protoble_internal -> gatt_mtu - 1 ));
124
127
gatt_rsp .attr_value .handle = param -> read .handle ;
125
128
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 ;
131
143
}
132
- read_len -= gatt_rsp .attr_value .len ;
133
144
esp_err_t err = esp_ble_gatts_send_response (gatts_if , param -> read .conn_id ,
134
145
param -> read .trans_id , status , & gatt_rsp );
135
146
if (err != ESP_OK ) {
0 commit comments