Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src/usr.bin/gzip



Please, can you keep your commit messages to the point?

  "Fix unportable left shift"

is probably a good enough summary.  You don't have to paste the test
suite results and the actual diffs in free form as well.

On Tue, Jun 12, 2018 at 00:42:17 +0000, Kamil Rytarowski wrote:

> Log Message:
> Correct Undefined Behavior in gzip(1)
> 
> 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>

-uwe


Home | Main Index | Thread Index | Old Index