summaryrefslogtreecommitdiff
path: root/gencode.c
diff options
context:
space:
mode:
authorguy <guy>2006-05-28 20:12:28 +0000
committerguy <guy>2006-05-28 20:12:28 +0000
commitd91be5b8afc2d423e1cf2fc71f8c8271a6f8954d (patch)
treed047c2d6c175144b6b8b02d7db6bd71764d9024c /gencode.c
parent520a3ea5594674e2b68664a1366aabb25f3c94fe (diff)
downloadlibpcap-d91be5b8afc2d423e1cf2fc71f8c8271a6f8954d.tar.gz
C89 says that the result of shifting an N-bit value by >= N bits is
undefined; we want it to be zero, so we explicitly check for a 32-bit shift count and clear the netmask in that case.
Diffstat (limited to 'gencode.c')
-rw-r--r--gencode.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gencode.c b/gencode.c
index d7b704a9..472427b9 100644
--- a/gencode.c
+++ b/gencode.c
@@ -21,7 +21,7 @@
*/
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.267 2006-05-18 08:40:52 hannes Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.268 2006-05-28 20:12:28 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -5019,7 +5019,14 @@ gen_mcode(s1, s2, masklen, q)
/* Convert mask len to mask */
if (masklen > 32)
bpf_error("mask length must be <= 32");
- m = 0xffffffff << (32 - masklen);
+ if (masklen == 0) {
+ /*
+ * X << 32 is not guaranteed by C to be 0; it's
+ * undefined.
+ */
+ m = 0;
+ } else
+ m = 0xffffffff << (32 - masklen);
if ((n & ~m) != 0)
bpf_error("non-network bits set in \"%s/%d\"",
s1, masklen);