HomeFreeBSD

MFC r336113:

Description

MFC r336113:
gzip: fix for undefined behavior.

Unportable left shift reported with MKSANITIZER=yes
USE_SANITIZER=undefined:

progress -zf ./games.tgz tar -xp -C "./" -f -

/public/src.git/usr.bin/gzip/gzip.c:2126:33: runtime error: left shift of
251 by 24 places cannot be represented in type 'int'
100%

************************

44500 KiB 119.69 MiB/s 00:00 ETA

Refactor the following code into something that is more clear
and fix signed integer shift, by casting all buf[] elements to
(unsigned int):

unsigned char buf[8];
uint32_t usize;
[...]
else {

usize = buf[4] | buf[5] << 8 |
        buf[6] << 16 | buf[7] << 24;

[...]

New version:

usize = buf[4];
usize |= (unsigned int)buf[5] << 8;
usize |= (unsigned int)buf[6] << 16;
usize |= (unsigned int)buf[7] << 24;

Only the "<< 24" part needs explicit cast, but for consistency make the
integer promotion explicit and clear to a code reader.

Sponsored by <The NetBSD Foundation>

Obtained from: NetBSD (CVS rev. 1.113)

Details

Provenance
pfgAuthored on
Parents
rS336322: MFC r336115;
Branches
Unknown
Tags
Unknown