summaryrefslogtreecommitdiff
path: root/print-802_15_4.c
diff options
context:
space:
mode:
authorFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2019-03-28 13:44:50 +0100
committerFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2019-03-28 14:13:27 +0100
commit400643120a48eca33973f6a47b34f0dcfde4d20a (patch)
tree1b13f95a009e86c6e4fbb3249f03177e0b83b508 /print-802_15_4.c
parentf280b3c0dfb5200512ebb03b1e9b7e2ab868dd5b (diff)
downloadtcpdump-400643120a48eca33973f6a47b34f0dcfde4d20a.tar.gz
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."
Diffstat (limited to 'print-802_15_4.c')
-rw-r--r--print-802_15_4.c8
1 files changed, 4 insertions, 4 deletions
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 */