diff options
author | Martin Liska <mliska@suse.cz> | 2020-05-19 16:57:56 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-06-10 13:19:08 +0200 |
commit | 8b6731e674c76cb48a417f2eef74ced92a17f469 (patch) | |
tree | 7e4a4ea5b92353de7e4faad653e5a0e4c7b9a566 /gcc | |
parent | df81764ba1a276d9b48f408bd2dd1e71e09e7863 (diff) | |
download | gcc-8b6731e674c76cb48a417f2eef74ced92a17f469.zip gcc-8b6731e674c76cb48a417f2eef74ced92a17f469.tar.gz gcc-8b6731e674c76cb48a417f2eef74ced92a17f469.tar.bz2 |
Add missing store in emission of asan_stack_free.
gcc/ChangeLog:
2020-05-19 Martin Liska <mliska@suse.cz>
PR sanitizer/94910
* asan.c (asan_emit_stack_protection): Emit
also **SavedFlagPtr(FakeStack, class_id) = 0 in order to release
a stack frame.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/asan.c | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -1598,8 +1598,24 @@ asan_emit_stack_protection (rtx base, rtx pbase, unsigned int alignb, if (use_after_return_class < 5 && can_store_by_pieces (sz, builtin_memset_read_str, &c, BITS_PER_UNIT, true)) - store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c, - BITS_PER_UNIT, true, RETURN_BEGIN); + { + /* Emit: + memset(ShadowBase, kAsanStackAfterReturnMagic, ShadowSize); + **SavedFlagPtr(FakeStack, class_id) = 0 + */ + store_by_pieces (shadow_mem, sz, builtin_memset_read_str, &c, + BITS_PER_UNIT, true, RETURN_BEGIN); + + unsigned HOST_WIDE_INT offset + = (1 << (use_after_return_class + 6)); + offset -= GET_MODE_SIZE (ptr_mode); + mem = gen_rtx_MEM (ptr_mode, base); + mem = adjust_address (mem, ptr_mode, offset); + rtx addr = gen_reg_rtx (ptr_mode); + emit_move_insn (addr, mem); + mem = gen_rtx_MEM (QImode, addr); + emit_move_insn (mem, const0_rtx); + } else if (use_after_return_class >= 5 || !set_storage_via_setmem (shadow_mem, GEN_INT (sz), |