Philipp Tomsich <philipp.toms...@vrull.eu> writes:
> 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.toms...@vrull.eu>
>
> ---
>
> Changes in v2:
> - Add a a regression test (as per review comment).
>
>  gcc/config/aarch64/driver-aarch64.cc              |  4 ++--
>  .../gcc.target/aarch64/cpunative/info_18          |  8 ++++++++
>  .../gcc.target/aarch64/cpunative/native_cpu_18.c  | 15 +++++++++++++++
>  3 files changed, 25 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/cpunative/info_18
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_18.c
>
> diff --git a/gcc/config/aarch64/driver-aarch64.cc 
> b/gcc/config/aarch64/driver-aarch64.cc
> index 52ff537908e..48250e68034 100644
> --- a/gcc/config/aarch64/driver-aarch64.cc
> +++ b/gcc/config/aarch64/driver-aarch64.cc
> @@ -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'));

Very minor, but: I think the normal GCC style would be to avoid the
extra (...).

OK with that change, thanks.  OK for backports too after a settling period.

Richard

>  
>    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
> index 00000000000..25061a4abe8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/cpunative/info_18
> @@ -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
> index 00000000000..b5f0a3005f5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/cpunative/native_cpu_18.c
> @@ -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). */

Reply via email to