X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/f570e6be7c5573f6e9310db751ede041a5e6151f..c60ebf10efd105d149f7c2d3eb15dec38af45001:/pcap-dos.c diff --git a/pcap-dos.c b/pcap-dos.c index cdd60ea4..e2b3fb74 100644 --- a/pcap-dos.c +++ b/pcap-dos.c @@ -12,6 +12,7 @@ #include #include #include +#include /* for INT_MAX */ #include #if defined(USE_32BIT_DRIVERS) @@ -355,7 +356,22 @@ pcap_read_dos (pcap_t *p, int cnt, pcap_handler callback, u_char *data) { int rc, num = 0; - while (num <= cnt || PACKET_COUNT_IS_UNLIMITED(cnt)) + /* + * This can conceivably process more than INT_MAX packets, + * which would overflow the packet count, causing it either + * to look like a negative number, and thus cause us to + * return a value that looks like an error, or overflow + * back into positive territory, and thus cause us to + * return a too-low count. + * + * Therefore, if the packet count is unlimited, we clip + * it at INT_MAX; this routine is not expected to + * process packets indefinitely, so that's not an issue. + */ + if (PACKET_COUNT_IS_UNLIMITED(cnt)) + cnt = INT_MAX; + + while (num <= cnt) { if (p->fd <= 0) return (-1);