From: Tim Kientzle Date: Sat, 29 Jun 2013 15:15:23 +0000 (-0700) Subject: Rework the sign-extension to avoid left-shift of X-Git-Tag: v3.1.900a~351^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=533e8fdaf3669fe0e246f675178f785e4eecd55a;p=thirdparty%2Flibarchive.git Rework the sign-extension to avoid left-shift of an explicit negative number (which newer GCC complains about). --- diff --git a/libarchive/archive_read_support_format_tar.c b/libarchive/archive_read_support_format_tar.c index 1f33feeed..95960a2c1 100644 --- a/libarchive/archive_read_support_format_tar.c +++ b/libarchive/archive_read_support_format_tar.c @@ -2477,20 +2477,16 @@ tar_atol256(const char *_p, size_t char_cnt) upper_limit = INT64_MAX / 256; lower_limit = INT64_MIN / 256; - /* Pad with 1 or 0 bits, depending on sign. */ + /* Sign-extend the 7-bit value to 64 bits. */ if ((0x40 & *p) == 0x40) - l = (int64_t)-1; + l = ~((int64_t)0x3f) | *p++; else - l = 0; - l = (l << 6) | (0x3f & *p++); + l = 0x3f & *p++; while (--char_cnt > 0) { - if (l > upper_limit) { - l = INT64_MAX; /* Truncate on overflow */ - break; - } else if (l < lower_limit) { - l = INT64_MIN; - break; - } + if (l > upper_limit) + return (INT64_MAX); /* Truncate on overflow */ + else if (l < lower_limit) + return (INT64_MIN); l = (l << 8) | (0xff & (int64_t)*p++); } return (l);