[PATCH] [Sanitizers] Intercept opendir()

Viktor Kutuzov vkutuzov at accesssoftek.com
Fri Jan 16 06:36:40 PST 2015


- The opendir() interceptor moved to Msan so it doesn't interfere with the Tsan's one;
- The comment fixed to mention internal structures that cause false positives;
- A test added.


http://reviews.llvm.org/D6968

Files:
  lib/msan/msan_interceptors.cc
  lib/msan/tests/msan_test.cc

Index: lib/msan/msan_interceptors.cc
===================================================================
--- lib/msan/msan_interceptors.cc
+++ lib/msan/msan_interceptors.cc
@@ -1084,6 +1084,21 @@
   return res;
 }
 
+#if SANITIZER_FREEBSD
+// On FreeBSD opendir() relies on strlen() to inspect internal structures
+// so we have to intercept it.
+INTERCEPTOR(__sanitizer_dirent *, opendir, const char *filename) {
+  ENSURE_MSAN_INITED();
+  SIZE_T len = REAL(strlen)(filename);
+  CHECK_UNPOISONED(filename, len + 1);
+  InterceptorScope interceptor_scope;
+  return REAL(opendir)(filename);
+}
+#define MSAN_MAYBE_INTERCEPT_OPENDIR INTERCEPT_FUNCTION(opendir)
+#else
+#define MSAN_MAYBE_INTERCEPT_OPENDIR
+#endif
+
 class SignalHandlerScope {
  public:
   SignalHandlerScope() {
@@ -1667,6 +1682,7 @@
   INTERCEPT_FUNCTION(__cxa_atexit);
   INTERCEPT_FUNCTION(shmat);
   INTERCEPT_FUNCTION(fork);
+  MSAN_MAYBE_INTERCEPT_OPENDIR;
 
   inited = 1;
 }
Index: lib/msan/tests/msan_test.cc
===================================================================
--- lib/msan/tests/msan_test.cc
+++ lib/msan/tests/msan_test.cc
@@ -1225,6 +1225,16 @@
   ASSERT_EQ(res, strlen(buf2) + 1);
 }
 
+TEST(MemorySanitizer, opendir) {
+  DIR *dir = opendir(".");
+  closedir(dir);
+
+  char name[10] = ".";
+  __msan_poison(name, sizeof(name));
+  EXPECT_UMR(dir = opendir(name));
+  closedir(dir);
+}
+
 TEST(MemorySanitizer, readdir) {
   DIR *dir = opendir(".");
   struct dirent *d = readdir(dir);

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6968.18300.patch
Type: text/x-patch
Size: 1485 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150116/32f66f19/attachment.bin>


More information about the llvm-commits mailing list