From: Francois-Xavier Le Bail Date: Thu, 28 Mar 2019 12:44:50 +0000 (+0100) Subject: IEEE 802.15.4: Fix an undefined behavior at runtime X-Git-Tag: tcpdump-4.99-bp~868 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/400643120a48eca33973f6a47b34f0dcfde4d20a IEEE 802.15.4: Fix an undefined behavior at runtime The error was: print-802_15_4.c:442:9: runtime error: implicit conversion from type 'int' of value 15840046 (32-bit, signed) to type 'uint16_t' (aka 'unsigned short') changed the value to 45870 (16-bit, unsigned) Proposal of fix by Guy Harris: "Those shifted values will be converted (in the C abstract machine) to int, but they'll all be in the range 0 to 65535, as will be the XOR of all 4 of them; converting that to a uint16_t isn't undefined behavior." --- diff --git a/print-802_15_4.c b/print-802_15_4.c index 54279cca..b1800e08 100644 --- a/print-802_15_4.c +++ b/print-802_15_4.c @@ -439,10 +439,10 @@ ieee802_15_4_crc16(const u_char *p, /* Update CRC */ x = crc >> 8 ^ y; x ^= x >> 4; - crc = (crc << 8) ^ - ((unsigned short)(x << 12)) ^ - ((unsigned short)(x <<5)) ^ - ((unsigned short)x); + crc = ((uint16_t)(crc << 8)) ^ + ((uint16_t)(x << 12)) ^ + ((uint16_t)(x << 5)) ^ + ((uint16_t)x); data_len--; } /* Reverse bits on output */