llvm-6502/lib
Chandler Carruth 0b8b3ba21e Harden the Unix signals code to be more async signal safe.
This is likely only the tip of the ice berg, but this particular bug
caused any double-free on a glibc system to turn into a deadlock! It is
not generally safe to either allocate or release heap memory from within
the signal handler. The 'pop_back()' in RemoveFilesToRemove was deleting
memory and causing the deadlock. What's worse, eraseFromDisk in PathV1
has lots of allocation and deallocation paths. We even passed 'true' in
a place that would have caused the *signal handler* to try to run the
'system' system call and shell out to 'rm -rf'. That was never going to
work...

This patch switches the file removal to use a vector of strings so that
the exact text needed for the 'unlink' system call can be stored there.
It switches the loop to be a boring indexed loop, and directly calls
unlink without looking at the error. It also works quite hard to ensure
that calling 'c_str()' is safe, by ensuring that the non-signal-handling
code path that manipulates the vector always leaves it in a state where
every element has already had 'c_str()' called at least once.

I dunno exactly how overkill this is, but it fixes the
deadlock-on-double free issue, and seems likely to prevent any other
issues from sneaking up.

Sorry for not having a test case, but I *really* don't know how to test
signal handling code easily....

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158580 91177308-0d34-0410-b5e6-96231b3b80d8
2012-06-16 00:09:41 +00:00
..
Analysis Round 2 of dead private variable removal. 2012-06-06 19:47:08 +00:00
Archive Include cstdio in a few place that depended on getting it transitively through StringExtras.h 2012-03-23 11:35:30 +00:00
AsmParser switch AttrListPtr::get to take an ArrayRef, simplifying a lot of clients. 2012-05-28 01:47:44 +00:00
Bitcode PR1255: case ranges. 2012-06-02 09:42:43 +00:00
CodeGen Remove final verification in RABasic. 2012-06-15 23:48:48 +00:00
DebugInfo Fix a C++11 UDL conflict. 2012-04-04 20:33:56 +00:00
ExecutionEngine Round 2 of dead private variable removal. 2012-06-06 19:47:08 +00:00
Linker Supply a C interface to the "LinkModules" method. 2012-05-09 08:55:40 +00:00
MC Factor macro argument parsing into helper methods and add support for .irp. 2012-06-15 14:02:34 +00:00
Object Had a closing brace inside an #ifdef -- oops! 2012-06-15 01:15:47 +00:00
Support Harden the Unix signals code to be more async signal safe. 2012-06-16 00:09:41 +00:00
TableGen Eliminate struct TableGenBackend. 2012-06-13 05:15:49 +00:00
Target Fix the encoding of the armv7m (MClass) for MSR registers other than aspr, 2012-06-15 22:14:44 +00:00
Transforms LSR: fix expansion of scaled reg in non-address type formulae. 2012-06-15 20:07:29 +00:00
VMCore When linearizing a multiplication, return at once if we see a factor of zero, 2012-06-13 09:42:13 +00:00
CMakeLists.txt
LLVMBuild.txt LLVMBuild: Introduce a common section which currently has a list of the 2011-12-12 22:45:54 +00:00
Makefile