Skip to content

Commit ea4be99

Browse files
committed
Fix integer overflow for ridiculously large configured recv buffer
1 parent 620fab3 commit ea4be99

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

erts/emulator/drivers/common/inet_drv.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14696,8 +14696,17 @@ static int packet_inet_input(udp_descriptor* udesc, HANDLE event)
1469614696
ASSERT(IS_SCTP(desc));
1469714697
bufsz = udesc->i_ptr - udesc->i_buf->orig_bytes;
1469814698
if (udesc->i_bufsz - bufsz < desc->bufsz) { /* Headroom */
14699-
bufsz = udesc->i_bufsz + desc->bufsz;
14700-
if ((tmp = realloc_buffer(udesc->i_buf, bufsz)) == NULL) {
14699+
int new_bufsz;
14700+
new_bufsz = INT_MAX - desc->bufsz; /* Headroom for + */
14701+
if (new_bufsz < udesc->i_bufsz) /* Would overflow? */
14702+
if (new_bufsz < bufsz) /* Would also overflow? */
14703+
goto bufsz_overflow;
14704+
else
14705+
new_bufsz = desc->bufsz + bufsz;
14706+
else
14707+
new_bufsz = desc->bufsz + udesc->i_bufsz;
14708+
if ((tmp = realloc_buffer(udesc->i_buf, new_bufsz)) == NULL) {
14709+
bufsz_overflow:
1470114710
release_buffer(udesc->i_buf);
1470214711
udesc->i_buf = NULL;
1470314712
return packet_error(udesc, ENOMEM);
@@ -14706,7 +14715,7 @@ static int packet_inet_input(udp_descriptor* udesc, HANDLE event)
1470614715
tmp->orig_bytes +
1470714716
(udesc->i_ptr - udesc->i_buf->orig_bytes);
1470814717
udesc->i_buf = tmp;
14709-
udesc->i_bufsz = bufsz;
14718+
udesc->i_bufsz = new_bufsz;
1471014719
}
1471114720
have_fragment = TRUE;
1471214721
} else

0 commit comments

Comments
 (0)