aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2012-06-16 00:09:41 +0000
committerChandler Carruth <chandlerc@gmail.com>2012-06-16 00:09:41 +0000
commite6196eba0d19c88a6d84e0675af1c4bd2d36de6e (patch)
tree961dcd74455630264c9f1268dc40aec5df5bbd4b /clang/lib/Basic/SourceManager.cpp
parentde409b6d5f9fa835ee4d7e22d571ff7fc0c052b1 (diff)
downloadllvm-e6196eba0d19c88a6d84e0675af1c4bd2d36de6e.zip
llvm-e6196eba0d19c88a6d84e0675af1c4bd2d36de6e.tar.gz
llvm-e6196eba0d19c88a6d84e0675af1c4bd2d36de6e.tar.bz2
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.... llvm-svn: 158580
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
0 files changed, 0 insertions, 0 deletions