summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchefmax <chefmax@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-10 12:57:14 +0000
committerchefmax <chefmax@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-10 12:57:14 +0000
commit9cf3aec30334c18f547f9f01869b61894e653bf6 (patch)
tree7eeb6904969950f8b4667881368ec5fae1d03df8
parentf5de8018493046bb9369608312f93fac4a97080c (diff)
downloadgcc-9cf3aec30334c18f547f9f01869b61894e653bf6.tar.gz
2016-06-10 Maxim Ostapenko <m.ostapenko@samsung.com>
PR sanitizer/71480 * varasm.c (place_block_symbol): Adjust alignment for asan protected STRING_CSTs even if TREE_CONSTANT_POOL_ADDRESS_P. * c-c++-common/asan/pr71480.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237306 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/asan/pr71480.c42
-rw-r--r--gcc/varasm.c6
4 files changed, 58 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 954adf37947..73ba814f135 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-06-10 Maxim Ostapenko <m.ostapenko@samsung.com>
+
+ PR sanitizer/71480
+ * varasm.c (place_block_symbol): Adjust alignment for asan protected
+ STRING_CSTs even if TREE_CONSTANT_POOL_ADDRESS_P.
+
2016-06-10 Jan Hubicka <hubicka@ucw.cz>
* profile.c: Include cfgloop.h.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2e640a5b189..19f37934023 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-10 Maxim Ostapenko <m.ostapenko@samsung.com>
+
+ PR sanitizer/71480
+ * c-c++-common/asan/pr71480.c: New test.
+
2016-06-10 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/guality/pr68037-1.c (ASMNAME): New.
diff --git a/gcc/testsuite/c-c++-common/asan/pr71480.c b/gcc/testsuite/c-c++-common/asan/pr71480.c
new file mode 100644
index 00000000000..c23ea5385b4
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/asan/pr71480.c
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+
+__attribute__ ((noinline, noclone)) int
+foo (char *c)
+{
+ asm volatile ("" : : "r" (c) : "memory");
+ return 1;
+}
+
+__attribute__ ((noinline, noclone)) void
+bar (char *c)
+{
+ asm volatile ("" : : "r" (c) : "memory");
+}
+
+int main ()
+{
+ char tpl[20] = "/tmp/test.XXXXXX";
+ char tpl2[20] = "/tmp/test.XXXXXX";
+ int fd = foo (tpl);
+ int fd2 = foo (tpl2);
+ if (fd == -1)
+ {
+ if (fd2 != -1)
+ bar (tpl2);
+ return 1;
+ }
+
+ if (fd2 == -1)
+ return 1;
+
+ bar (tpl);
+ bar (tpl2);
+
+ if (__builtin_strcmp (tpl, "/tmp/test.XXXXXX") != 0)
+ return 1;
+
+ if (__builtin_strcmp (tpl, tpl2) != 0)
+ return 1;
+
+ return 0;
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 4a7124e73be..de8bcd6f20c 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7201,7 +7201,11 @@ place_block_symbol (rtx symbol)
if ((flag_sanitize & SANITIZE_ADDRESS)
&& TREE_CODE (DECL_INITIAL (decl)) == STRING_CST
&& asan_protect_global (DECL_INITIAL (decl)))
- size += asan_red_zone_size (size);
+ {
+ size += asan_red_zone_size (size);
+ alignment = MAX (alignment,
+ ASAN_RED_ZONE_SIZE * BITS_PER_UNIT);
+ }
}
else
{