From: Stanley Tng Date: Mon, 2 Apr 2018 16:08:22 +0000 (-0700) Subject: Handle bad packet length in gatts_process_read_req X-Git-Tag: android-x86-9.0-r1~100^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=b63f087fc79c3d1a66f73c3a34e8a73ebd65e82d;p=android-x86%2Fsystem-bt.git Handle bad packet length in gatts_process_read_req Added error check and handling code in gatts_process_read_req to make sure that the packet length is correct. Bug: 73172115 Test: Run the test program, poc, that was attached in the bug report Change-Id: I375853987010c87432e73b75d659eabee852ec9c --- diff --git a/stack/gatt/gatt_sr.cc b/stack/gatt/gatt_sr.cc index f955fbfca..37a177324 100644 --- a/stack/gatt/gatt_sr.cc +++ b/stack/gatt/gatt_sr.cc @@ -22,6 +22,7 @@ * ******************************************************************************/ +#include #include "bt_target.h" #include "bt_utils.h" #include "osi/include/osi.h" @@ -942,9 +943,19 @@ void gatts_process_write_req(tGATT_TCB& tcb, tGATT_SRV_LIST_ELEM& el, */ static void gatts_process_read_req(tGATT_TCB& tcb, tGATT_SRV_LIST_ELEM& el, uint8_t op_code, uint16_t handle, - UNUSED_ATTR uint16_t len, uint8_t* p_data) { + uint16_t len, uint8_t* p_data) { size_t buf_len = sizeof(BT_HDR) + tcb.payload_size + L2CAP_MIN_OFFSET; uint16_t offset = 0; + + if (op_code == GATT_REQ_READ_BLOB && len < sizeof(uint16_t)) { + /* Error: packet length is too short */ + LOG(ERROR) << __func__ << ": packet length=" << len + << " too short. min=" << sizeof(uint16_t); + android_errorWriteWithInfoLog(0x534e4554, "73172115", -1, NULL, 0); + gatt_send_error_rsp(tcb, GATT_INVALID_PDU, op_code, 0, false); + return; + } + BT_HDR* p_msg = (BT_HDR*)osi_calloc(buf_len); if (op_code == GATT_REQ_READ_BLOB) STREAM_TO_UINT16(offset, p_data); @@ -966,7 +977,7 @@ static void gatts_process_read_req(tGATT_TCB& tcb, tGATT_SRV_LIST_ELEM& el, if (reason != GATT_SUCCESS) { osi_free(p_msg); - /* in theroy BUSY is not possible(should already been checked), protected + /* in theory BUSY is not possible(should already been checked), protected * check */ if (reason != GATT_PENDING && reason != GATT_BUSY) gatt_send_error_rsp(tcb, reason, op_code, handle, false);