re PR sanitizer/80308 (asan crash on big-endian powerpc-linux target)
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Apr 2017 13:17:15 +0000 (15:17 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Apr 2017 13:17:15 +0000 (15:17 +0200)
PR sanitizer/80308
* asan.c (asan_store_shadow_bytes): Fix location of last_chunk_value
for big endian.

* c-c++-common/asan/pr80308.c: New test.

Co-Authored-By: Bernd Edlinger <bernd.edlinger@hotmail.de>
From-SVN: r246703

gcc/ChangeLog
gcc/asan.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/asan/pr80308.c [new file with mode: 0644]

index 873d0bcc3e71aaebb5077154f9f310f2251acfdc..0158a389ad7c658068f148da37ca35be53c67af1 100644 (file)
@@ -1,3 +1,10 @@
+2017-04-05  Jakub Jelinek  <jakub@redhat.com>
+           Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR sanitizer/80308
+       * asan.c (asan_store_shadow_bytes): Fix location of last_chunk_value
+       for big endian.
+
 2017-04-05  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/78002
index f1098cbffacea66987a62585850fd4363261d7c4..bf564a46b283339849508e3be0bfb212819a3464 100644 (file)
@@ -2757,10 +2757,13 @@ asan_store_shadow_bytes (gimple_stmt_iterator *iter, location_t loc,
 
   unsigned char c = (char) is_clobber ? ASAN_STACK_MAGIC_USE_AFTER_SCOPE : 0;
   unsigned HOST_WIDE_INT val = 0;
+  unsigned last_pos = size;
+  if (last_chunk_size && !is_clobber)
+    last_pos = BYTES_BIG_ENDIAN ? 0 : size - 1;
   for (unsigned i = 0; i < size; ++i)
     {
       unsigned char shadow_c = c;
-      if (i == size - 1 && last_chunk_size && !is_clobber)
+      if (i == last_pos)
        shadow_c = last_chunk_size;
       val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
     }
index 98aa5c0b6dadb4e5ab01e5311aa43846cf873c43..b0c764f3949d2b34fb53ea9db68ef8ae6a359bc1 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/80308
+       * c-c++-common/asan/pr80308.c: New test.
+
 2017-04-05  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        PR target/79890
diff --git a/gcc/testsuite/c-c++-common/asan/pr80308.c b/gcc/testsuite/c-c++-common/asan/pr80308.c
new file mode 100644 (file)
index 0000000..bcfa6ae
--- /dev/null
@@ -0,0 +1,25 @@
+/* PR sanitizer/80308 */
+/* { dg-do run } */
+
+__attribute__((noinline, noclone)) int
+foo (char *a)
+{
+  int i, j = 0;
+  asm volatile ("" : "+r" (a) : : "memory");
+  for (i = 0; i < 12; i++)
+    j += a[i];
+  return j;
+}
+
+int
+main ()
+{
+  int i, j = 0;
+  for (i = 0; i < 4; i++)
+    {
+      char a[12];
+      __builtin_memset (a, 0, sizeof (a));
+      j += foo (a);
+    }
+  return j;
+}