[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