Skip to content

Commit 33f4682

Browse files
committed
bin: validate received packet bounds
Reported-by: Haruto Kimura (Stella) (cherry picked from commit 76b61fefdb0ae125583030be5f999b74756a056c)
1 parent ba31dfa commit 33f4682

1 file changed

Lines changed: 17 additions & 0 deletions

File tree

bin_interface.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ void call_callbacks(char* buffer, struct receive_info *rcv)
439439
str capability;
440440

441441
memcpy(&pkg_len, buffer + BIN_PACKET_MARKER_SIZE, sizeof(unsigned int));
442+
if (pkg_len < HEADER_SIZE + LEN_FIELD_SIZE + CMD_FIELD_SIZE) {
443+
LM_ERR("invalid BIN packet size %u\n", pkg_len);
444+
return;
445+
}
446+
if (pkg_len > BIN_MAX_BUF_LEN) {
447+
LM_ERR("BIN packet size %u exceeds max size %zu\n",
448+
pkg_len, BIN_MAX_BUF_LEN);
449+
return;
450+
}
451+
442452
//add extra size so a realloc wont trigger after small altering of the packet
443453
packet.buffer.s = pkg_malloc(pkg_len + 50);
444454
if (!packet.buffer.s) {
@@ -452,6 +462,13 @@ void call_callbacks(char* buffer, struct receive_info *rcv)
452462
memcpy(packet.buffer.s, buffer, pkg_len);
453463

454464
bin_get_capability(&packet, &capability);
465+
if ((unsigned int)capability.len >
466+
pkg_len - HEADER_SIZE - LEN_FIELD_SIZE - CMD_FIELD_SIZE) {
467+
LM_ERR("invalid BIN packet capability length %d for packet size %u\n",
468+
capability.len, pkg_len);
469+
bin_free_packet(&packet);
470+
return;
471+
}
455472

456473
packet.front_pointer = capability.s + capability.len + CMD_FIELD_SIZE;
457474
memcpy(&packet.type, capability.s + capability.len, sizeof(int));

0 commit comments

Comments
 (0)