]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib: fix crc32 and crc64 interger overflows [AddressSanitizer]
authorSami Kerola <kerolasa@iki.fi>
Sat, 22 Nov 2014 00:31:07 +0000 (00:31 +0000)
committerSami Kerola <kerolasa@iki.fi>
Fri, 19 Dec 2014 09:10:48 +0000 (09:10 +0000)
lib/crc32.c:111:11: runtime error: unsigned integer overflow: 0 - 1
cannot be represented in type 'size_t' (aka 'unsigned long')

lib/crc64.c:101:12: runtime error: unsigned integer overflow: 0 - 1
cannot be represented in type 'size_t' (aka 'unsigned long')

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
lib/crc32.c
lib/crc64.c

index eaaa06a0cd894adc87765053076201e84314336b..be98f1a8d12796c057a841aef7521ce27e45aca2 100644 (file)
@@ -108,8 +108,10 @@ uint32_t crc32(uint32_t seed, const unsigned char *buf, size_t len)
        uint32_t crc = seed;
        const unsigned char *p = buf;
 
-       while(len-- > 0)
+       while (len) {
                crc = crc32_tab[(crc ^ *p++) & 0xff] ^ (crc >> 8);
+               len--;
+       }
 
        return crc;
 }
index 091e95d766639af4f7b9f8d3ff610c472b1b07e2..0be78e63becfe37a89e7fb5a3d1555c8dea63a56 100644 (file)
@@ -98,9 +98,10 @@ uint64_t crc64(uint64_t seed, const unsigned char *data, size_t len)
 {
        uint64_t crc = seed;
 
-       while (len--) {
+       while (len) {
                int i = ((int) (crc >> 56) ^ *data++) & 0xFF;
                crc = crc64_tab[i] ^ (crc << 8);
+               len--;
        }
 
        return crc;