From 400643120a48eca33973f6a47b34f0dcfde4d20a Mon Sep 17 00:00:00 2001 From: Francois-Xavier Le Bail Date: Thu, 28 Mar 2019 13:44:50 +0100 Subject: [PATCH] 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." --- print-802_15_4.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/print-802_15_4.c b/print-802_15_4.c index 54279ccaf..b1800e086 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 */