[compiler-rt] r257106 - Ensure safestack overflow test doesn't segfault
Dimitry Andric via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 7 14:19:12 PST 2016
Author: dim
Date: Thu Jan 7 16:19:12 2016
New Revision: 257106
URL: http://llvm.org/viewvc/llvm-project?rev=257106&view=rev
Log:
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
Modified:
compiler-rt/trunk/test/safestack/overflow.c
Modified: compiler-rt/trunk/test/safestack/overflow.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/overflow.c?rev=257106&r1=257105&r2=257106&view=diff
==============================================================================
--- compiler-rt/trunk/test/safestack/overflow.c (original)
+++ compiler-rt/trunk/test/safestack/overflow.c Thu Jan 7 16:19:12 2016
@@ -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;
}
More information about the llvm-commits
mailing list