bswap: convert to unsigned before shifting in get_be32
commit7780af1e8edf158f503794dbdb87787999daa086
authorRené Scharfe <l.s.r@web.de>
Sat, 15 Jul 2017 19:11:14 +0000 (15 21:11 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 17 Jul 2017 21:54:13 +0000 (17 14:54 -0700)
tree9deaeb85b2986fdc9ba4921414be3f103c92d1c6
parent95d67879735cfecfdd85f89e59d993c5b4de8835
bswap: convert to unsigned before shifting in get_be32

The pointer p is dereferenced and we get an unsigned char.  Before
shifting it's automatically promoted to int.  Left-shifting a signed
32-bit value bigger than 127 by 24 places is undefined.  Explicitly
convert to a 32-bit unsigned type to avoid undefined behaviour if
the highest bit is set.

Found with Clang's UBSan.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/bswap.h