summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2016-01-08 22:48:19 +0000
committerKostya Serebryany <kcc@google.com>2016-01-08 22:48:19 +0000
commitca3fff7b8c46e27247fe1ef813c51af6c5dda2a6 (patch)
treef1f25406f884837eb18817b5f7efd6c18dd5f4ed
parent1cba328e3de858250d9ecace8b9f35c545650b5c (diff)
downloadcompiler-rt-ca3fff7b8c46e27247fe1ef813c51af6c5dda2a6.tar.gz
[tsan] don't crash on closedir(0)
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@257223 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/tsan/rtl/tsan_interceptors.cc6
-rw-r--r--test/sanitizer_common/TestCases/Linux/closedir.c5
2 files changed, 9 insertions, 2 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc
index 62c96cb42..7c835c6dc 100644
--- a/lib/tsan/rtl/tsan_interceptors.cc
+++ b/lib/tsan/rtl/tsan_interceptors.cc
@@ -1892,8 +1892,10 @@ TSAN_INTERCEPTOR(int, rmdir, char *path) {
TSAN_INTERCEPTOR(int, closedir, void *dirp) {
SCOPED_TSAN_INTERCEPTOR(closedir, dirp);
- int fd = dirfd(dirp);
- FdClose(thr, pc, fd);
+ if (dirp) {
+ int fd = dirfd(dirp);
+ FdClose(thr, pc, fd);
+ }
return REAL(closedir)(dirp);
}
diff --git a/test/sanitizer_common/TestCases/Linux/closedir.c b/test/sanitizer_common/TestCases/Linux/closedir.c
new file mode 100644
index 000000000..990628db4
--- /dev/null
+++ b/test/sanitizer_common/TestCases/Linux/closedir.c
@@ -0,0 +1,5 @@
+// Check that closedir(NULL) is ok.
+// RUN: %clang -O2 %s -o %t && %run %t
+#include <sys/types.h>
+#include <dirent.h>
+int main() { closedir(0); }