@@ -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