]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Rework the sign-extension to avoid left-shift of
authorTim Kientzle <kientzle@acm.org>
Sat, 29 Jun 2013 15:15:23 +0000 (08:15 -0700)
committerTim Kientzle <kientzle@acm.org>
Sat, 29 Jun 2013 15:15:23 +0000 (08:15 -0700)
an explicit negative number (which newer GCC complains about).

libarchive/archive_read_support_format_tar.c

index 1f33feeed73ac423d49c96157ce1c23e7b45552b..95960a2c1833c532eb238b44a5a4d8fca997d64c 100644 (file)
@@ -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);