]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cksum: port to 32-bit uint_fast32_t
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 17 Feb 2025 10:27:09 +0000 (02:27 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 17 Feb 2025 10:31:50 +0000 (02:31 -0800)
* src/cksum_vmull.c (cksum_vmull): Don’t assume
uint_fast32_t can hold 64 bits.
Problem reported by Alyssa Ross (Bug#76360).

NEWS
src/cksum_vmull.c

diff --git a/NEWS b/NEWS
index c6edf16d41ed58bf8fc5fb9a0bc83403d29fdfc9..981ffa7b43a99a831255a393304b09b49e1cf34d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,9 @@ GNU coreutils NEWS                                    -*- outline -*-
   output are the same terminal device and the output is append-only.
   [bug introduced in coreutils-9.6]
 
+  'cksum -a crc' misbehaved on aarch64 with 32-bit uint_fast32_t.
+  [bug introduced in coreutils-9.6]
+
   'ls -Z dir' would crash.
   [bug introduced in coreutils-9.6]
 
index 7611c42440ec6c96b6a2d726e6d83db497991e57..0ff81e225d719d55e8e82e8f2dd80b10d773b3e2 100644 (file)
@@ -92,7 +92,9 @@ cksum_vmull (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
           data = bswap_neon (data);
           /* XOR in initial CRC value (for us 0 so no effect), or CRC value
              calculated for previous BUFLEN buffer from fread */
-          xor_crc = vcombine_u64 (vcreate_u64 (0), vcreate_u64 (crc << 32));
+
+          uint64_t wcrc = crc;
+          xor_crc = vcombine_u64 (vcreate_u64 (0), vcreate_u64 (wcrc << 32));
           crc = 0;
           data = veorq_u64 (data, xor_crc);
           data3 = vld1q_u64 ((uint64_t *) (datap + 1));
@@ -193,7 +195,8 @@ cksum_vmull (FILE *fp, uint_fast32_t *crc_out, uintmax_t *length_out)
         {
           data = vld1q_u64 ((uint64_t *) (datap));
           data = bswap_neon (data);
-          xor_crc = vcombine_u64 (vcreate_u64 (0), vcreate_u64 (crc << 32));
+          uint64_t wcrc = crc;
+          xor_crc = vcombine_u64 (vcreate_u64 (0), vcreate_u64 (wcrc << 32));
           crc = 0;
           data = veorq_u64 (data, xor_crc);
           while (bytes_read >= 32)