aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-04-05 15:17:15 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-04-05 15:17:15 +0200
commit47a113429b00669d57bbea6aa84f51e4c4869592 (patch)
tree6423301157ac4961d6e04ab24b1d64431a50dfac /gcc
parent5f5c5e0f07c9ce7bff0498a028e9abbdf5a74183 (diff)
downloadgcc-47a113429b00669d57bbea6aa84f51e4c4869592.zip
gcc-47a113429b00669d57bbea6aa84f51e4c4869592.tar.gz
gcc-47a113429b00669d57bbea6aa84f51e4c4869592.tar.bz2
re PR sanitizer/80308 (asan crash on big-endian powerpc-linux target)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/asan.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/asan/pr80308.c25
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 873d0bc..0158a38 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/asan.c b/gcc/asan.c
index f1098cb..bf564a4 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 98aa5c0..b0c764f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..bcfa6ae
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/asan/pr80308.c
@@ -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;
+}