aboutsummaryrefslogtreecommitdiff
path: root/pcap-netfilter-linux.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2019-12-05 20:56:20 -0800
committerGuy Harris <guy@alum.mit.edu>2019-12-05 20:56:20 -0800
commit07b82c28370091aed9e0a495a46fe0643c195869 (patch)
tree2e2124d6238a06cb3acbac0d63fa698aa89a5bb2 /pcap-netfilter-linux.c
parent3a7962215f4f3b13ac792ad0e0487a53c0f1178e (diff)
Squelch some warnings.
Should fix GitHub issue #879.
Diffstat (limited to 'pcap-netfilter-linux.c')
-rw-r--r--pcap-netfilter-linux.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/pcap-netfilter-linux.c b/pcap-netfilter-linux.c
index cf0e2560..f78d7f30 100644
--- a/pcap-netfilter-linux.c
+++ b/pcap-netfilter-linux.c
@@ -159,7 +159,18 @@ netfilter_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_c
} else
return count;
}
- if (ep - bp < NLMSG_SPACE(0)) {
+ /*
+ * NLMSG_SPACE(0) might be signed or might be unsigned,
+ * depending on whether the kernel defines NLMSG_ALIGNTO
+ * as 4, which older kernels do, or as 4U, which newer
+ * kernels do.
+ *
+ * ep - bp is of type ptrdiff_t, which is signed.
+ *
+ * To squelch warnings, we cast both to size_t, which
+ * is unsigned; ep >= bp, so the cast is safe.
+ */
+ if ((size_t)(ep - bp) < (size_t)NLMSG_SPACE(0)) {
/*
* There's less than one netlink message left
* in the buffer. Give up.
@@ -262,8 +273,15 @@ netfilter_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_c
* If the message length would run past the end of the
* buffer, truncate it to the remaining space in the
* buffer.
+ *
+ * To squelch warnings, we cast ep - bp to uint32_t, which
+ * is unsigned and is the type of msg_len; ep >= bp, and
+ * len should fit in 32 bits (either it's set from an int
+ * or it's set from a recv() call with a buffer size that's
+ * an int, and we're assuming either ILP32 or LP64), so
+ * the cast is safe.
*/
- if (msg_len > ep - bp)
+ if (msg_len > (uint32_t)(ep - bp))
msg_len = (uint32_t)(ep - bp);
bp += msg_len;