]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: fix off-by-one in reading cpuinfo
authorPhilipp Tomsich <philipp.tomsich@vrull.eu>
Mon, 3 Oct 2022 19:59:50 +0000 (21:59 +0200)
committerPhilipp Tomsich <philipp.tomsich@vrull.eu>
Thu, 6 Oct 2022 10:33:49 +0000 (12:33 +0200)
Fixes: 341573406b39
Don't subtract one from the result of strnlen() when trying to point
to the first character after the current string.  This issue would
cause individual characters (where the 128 byte buffers are stitched
together) to be lost.

gcc/ChangeLog:

* config/aarch64/driver-aarch64.cc (readline): Fix off-by-one.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/cpunative/info_18: New test.
* gcc.target/aarch64/cpunative/native_cpu_18.c: New test.

Signed-off-by: Philipp Tomsich <philipp.tomsich@vrull.eu>
gcc/config/aarch64/driver-aarch64.cc
gcc/testsuite/gcc.target/aarch64/cpunative/info_18 [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_18.c [new file with mode: 0644]

index 52ff537908eac38161b11577225aa09bf2204d54..2ae47c020d3e6e6c9b55691c7a57ec2abb0bd0e1 100644 (file)
@@ -203,9 +203,9 @@ readline (FILE *f)
        return std::string ();
       /* If we're not at the end of the line then override the
         \0 added by fgets.  */
-      last = strnlen (buf, size) - 1;
+      last = strnlen (buf, size);
     }
-  while (!feof (f) && buf[last] != '\n');
+  while (!feof (f) && last > 0 && buf[last - 1] != '\n');
 
   std::string result (buf);
   free (buf);
diff --git a/gcc/testsuite/gcc.target/aarch64/cpunative/info_18 b/gcc/testsuite/gcc.target/aarch64/cpunative/info_18
new file mode 100644 (file)
index 0000000..25061a4
--- /dev/null
@@ -0,0 +1,8 @@
+processor      : 0
+BogoMIPS       : 2000.00
+Features       : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm ssbs sb dcpodp flagm2 frint i8mm bf16 rng ecv
+CPU implementer        : 0xc0
+CPU architecture: 8
+CPU variant    : 0x0
+CPU part       : 0xac3
+CPU revision   : 0
diff --git a/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_18.c b/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_18.c
new file mode 100644 (file)
index 0000000..b5f0a30
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { { aarch64*-*-linux*} && native } } } */
+/* { dg-set-compiler-env-var GCC_CPUINFO "$srcdir/gcc.target/aarch64/cpunative/info_18" } */
+/* { dg-additional-options "-mcpu=native" } */
+
+int main()
+{
+  return 0;
+}
+
+/* { dg-final { scan-assembler {\.arch armv8.6-a\+crc\+fp16\+aes\+sha3\+rng} } } */
+
+/* Test one where the boundary of buffer size would overwrite the last
+   character read when stitching the fgets-calls together.  With the
+   test data provided, this would truncate the 'sha512' into 'ha512'
+   (dropping the 'sha3' feature). */