diff options
Diffstat (limited to 'pcap-dos.c')
-rw-r--r-- | pcap-dos.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -12,6 +12,7 @@ #include <signal.h> #include <float.h> #include <fcntl.h> +#include <limits.h> /* for INT_MAX */ #include <io.h> #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); |