diff options
author | Dimitry Andric <dimitry@andric.com> | 2016-01-07 22:19:12 +0000 |
---|---|---|
committer | Dimitry Andric <dimitry@andric.com> | 2016-01-07 22:19:12 +0000 |
commit | 6aa348826a4877d8b964476fed02cd59c76d2ac4 (patch) | |
tree | d4263dc6b651029f895bfe5c1fb3e7892a56ea27 | |
parent | 7f5c1fd21ce0b3aaaffaa7d675bf09450e95727e (diff) | |
download | compiler-rt-6aa348826a4877d8b964476fed02cd59c76d2ac4.tar.gz |
Ensure safestack overflow test doesn't segfault
Summary:
In rL255491, the safestack overflow test was disabled for aarch64, since
it "is currently failing on an AArch64 buildbot with a segfault, but it
is currently passing on other configuration".
While testing on FreeBSD on x86, I also encountered a segfault. This is
because the `fct()` function actually writes before and after `buffer`,
and on FreeBSD this crashes because `buffer` is usually allocated at the
end of a page. That this runs correctly on Linux is probably just by
accident.
I propose to fix this by adding a pre and post buffer, to act as a
safety zone. The pre and post buffers must be accessed in an 'unsafe'
way, otherwise -fsanitize=safestack will allocate them on the safe
stack, and they will not bookend `buffer` itself. Therefore, I create
them large enough for `fct()`, and call it on both of them.
On FreeBSD, this makes the test run as expected, without segfaulting,
and I suppose this will also fix the segfault on AArch64. I do not have
AArch64 testing capabilities, so if someone could try that out, I would
be much obliged.
Reviewers: pcc, kcc, zatrazz
Subscribers: llvm-commits, aemerson, emaste
Differential Revision: http://reviews.llvm.org/D15725
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@257106 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/safestack/overflow.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/test/safestack/overflow.c b/test/safestack/overflow.c index 27436947e..62f865369 100644 --- a/test/safestack/overflow.c +++ b/test/safestack/overflow.c @@ -17,9 +17,13 @@ void fct(volatile int *buffer) int main(int argc, char **argv) { + int prebuf[7]; int value1 = 42; int buffer[5]; int value2 = 42; + int postbuf[7]; + fct(prebuf + 1); + fct(postbuf + 1); fct(buffer); return value1 != 42 || value2 != 42; } |