Source-Changes-HG archive

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

[src/trunk]: src/usr.bin/gzip Correct Undefined Behavior in gzip(1)



details:   https://anonhg.NetBSD.org/src/rev/6a52d32a74c4
branches:  trunk
changeset: 362462:6a52d32a74c4
user:      kamil <kamil%NetBSD.org@localhost>
date:      Tue Jun 12 00:42:17 2018 +0000

description:
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>

diffstat:

 usr.bin/gzip/gzip.c |  16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diffs (39 lines):

diff -r 5e4b7731cf17 -r 6a52d32a74c4 usr.bin/gzip/gzip.c
--- a/usr.bin/gzip/gzip.c       Tue Jun 12 00:19:17 2018 +0000
+++ b/usr.bin/gzip/gzip.c       Tue Jun 12 00:42:17 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: gzip.c,v 1.112 2017/08/23 13:04:17 christos Exp $      */
+/*     $NetBSD: gzip.c,v 1.113 2018/06/12 00:42:17 kamil Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 2003, 2004, 2006, 2008, 2009, 2010, 2011, 2015, 2017
@@ -31,7 +31,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1997, 1998, 2003, 2004, 2006, 2008,\
  2009, 2010, 2011, 2015, 2017 Matthew R. Green.  All rights reserved.");
-__RCSID("$NetBSD: gzip.c,v 1.112 2017/08/23 13:04:17 christos Exp $");
+__RCSID("$NetBSD: gzip.c,v 1.113 2018/06/12 00:42:17 kamil Exp $");
 #endif /* not lint */
 
 /*
@@ -2118,12 +2118,16 @@
                                maybe_warnx("read of uncompressed size");
 
                        else {
-                               usize = buf[4] | buf[5] << 8 |
-                                       buf[6] << 16 | buf[7] << 24;
+                               usize = buf[4];
+                               usize |= (unsigned int)buf[5] << 8;
+                               usize |= (unsigned int)buf[6] << 16;
+                               usize |= (unsigned int)buf[7] << 24;
                                in = (off_t)usize;
 #ifndef SMALL
-                               crc = buf[0] | buf[1] << 8 |
-                                     buf[2] << 16 | buf[3] << 24;
+                               crc = buf[0];
+                               crc |= (unsigned int)buf[1] << 8;
+                               crc |= (unsigned int)buf[2] << 16;
+                               crc |= (unsigned int)buf[3] << 24;
 #endif
                        }
                }



Home | Main Index | Thread Index | Old Index