diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
index 8350497..1dc4225 100644
--- a/android/avrcp-lib.c
+++ b/android/avrcp-lib.c
struct avrcp_header *pdu;
struct register_notification_rsp *rsp;
uint8_t event = 0;
- uint16_t value16;
+ uint16_t value16, value16_2[2];
uint32_t value32;
uint64_t value64;
uint8_t *params = NULL;
switch (event) {
case AVRCP_EVENT_STATUS_CHANGED:
case AVRCP_EVENT_VOLUME_CHANGED:
- if (pdu->params_len != 2) {
+ if (pdu->params_len != sizeof(*rsp) + sizeof(uint8_t)) {
err = -EPROTO;
goto done;
}
params = rsp->data;
break;
case AVRCP_EVENT_TRACK_CHANGED:
- if (pdu->params_len != 9) {
+ if (pdu->params_len != sizeof(*rsp) + sizeof(value64)) {
err = -EPROTO;
goto done;
}
params = (uint8_t *) &value64;
break;
case AVRCP_EVENT_PLAYBACK_POS_CHANGED:
- if (pdu->params_len != 5) {
+ if (pdu->params_len != sizeof(*rsp) + sizeof(value32)) {
err = -EPROTO;
goto done;
}
params = (uint8_t *) &value32;
break;
case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
+ if (pdu->params_len < sizeof(*rsp) + sizeof(value16_2)) {
+ err = -EPROTO;
+ goto done;
+ }
+ value16_2[0] = get_be16(rsp->data);
+ value16_2[1] = get_be16(rsp->data + 2);
+ params = (uint8_t *) value16_2;
+ break;
case AVRCP_EVENT_SETTINGS_CHANGED:
- if (pdu->params_len < 2) {
+ if (pdu->params_len < sizeof(*rsp) + sizeof(uint8_t)) {
err = -EPROTO;
goto done;
}
params = rsp->data;
break;
case AVRCP_EVENT_UIDS_CHANGED:
- if (pdu->params_len != 3) {
+ if (pdu->params_len < sizeof(*rsp) + sizeof(value16)) {
err = -EPROTO;
goto done;
}
void *data, size_t len)
{
struct iovec iov[2];
+ uint16_t *player;
if (event > AVRCP_EVENT_LAST)
return -EINVAL;
put_be32(*(uint32_t *) data, data);
break;
case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
+ if (len != 4)
+ return -EINVAL;
+
+ player = data;
+ put_be16(player[0], &player[0]);
+ put_be16(player[1], &player[1]);
+
+ break;
case AVRCP_EVENT_SETTINGS_CHANGED:
if (len < sizeof(uint8_t))
return -EINVAL;