ignore offset, replace whole value of attr in auth callback

pull/14625/head
Paul Szczepanek 2021-05-05 18:40:59 +01:00
parent 55ffb176d5
commit 17bf70989d
2 changed files with 8 additions and 3 deletions

View File

@ -1692,6 +1692,10 @@ public:
* @note The params->len parameter initially contains the maximum length of
* data that can be returned. Set it to the length of your data but it must
* not be larger than the original value.
*
* @note You must also take into account the offset provided in params->offset.
* The params->len you provide must be larger then the offset as the read operation
* will attempt to read at that offset.
*/
GattAuthCallbackReply_t authorizeRead(GattReadAuthCallbackParams *params)
{

View File

@ -1148,8 +1148,9 @@ uint8_t GattServer::atts_read_cb(
/* if new data provided copy into the attribute value buffer */
if (read_auth_params.data) {
if (read_auth_params.offset + read_auth_params.len > pAttr->maxLen) {
tr_error("Read authorisation callback set length larger than maximum attribute length. Cannot copy data");
if (read_auth_params.len > pAttr->maxLen || offset >= read_auth_params.len) {
tr_error("Read authorisation callback set length larger than maximum attribute length "
"or current offset is beyond new length. Cannot copy data");
GattReadCallbackParams read_params = {
connId,
@ -1164,7 +1165,7 @@ uint8_t GattServer::atts_read_cb(
return ATT_ERR_UNLIKELY;
}
memcpy(pAttr->pValue + read_auth_params.offset, read_auth_params.data, read_auth_params.len);
memcpy(pAttr->pValue, read_auth_params.data, read_auth_params.len);
*pAttr->pLen = read_auth_params.len;
}
}