summaryrefslogtreecommitdiff
path: root/lib/tsan/rtl/tsan_platform_linux.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-02-07 15:27:45 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-02-07 15:27:45 +0000
commit03f224835f46801a0e22cc2951d21b67304e0457 (patch)
treeaa954ccabb092f91bbe1e2187544179fab6b74ce /lib/tsan/rtl/tsan_platform_linux.cc
parent6cf1e6d92200f61bf275ca433c88c60c934e3086 (diff)
downloadcompiler-rt-03f224835f46801a0e22cc2951d21b67304e0457.tar.gz
tsan: intercept libc __res_iclose
this is required to catch close of file descriptors created in getaddrinfo() git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@174624 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl/tsan_platform_linux.cc')
-rw-r--r--lib/tsan/rtl/tsan_platform_linux.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_platform_linux.cc b/lib/tsan/rtl/tsan_platform_linux.cc
index 6cc424975..a8664731c 100644
--- a/lib/tsan/rtl/tsan_platform_linux.cc
+++ b/lib/tsan/rtl/tsan_platform_linux.cc
@@ -40,6 +40,8 @@
#include <errno.h>
#include <sched.h>
#include <dlfcn.h>
+#define __need_res_state
+#include <resolv.h>
extern "C" int arch_prctl(int code, __sanitizer::uptr *addr);
@@ -289,6 +291,19 @@ bool IsGlobalVar(uptr addr) {
return g_data_start && addr >= g_data_start && addr < g_data_end;
}
+#ifndef TSAN_GO
+int ExtractResolvFDs(void *state, int *fds, int nfd) {
+ int cnt = 0;
+ __res_state *statp = (__res_state*)state;
+ for (int i = 0; i < MAXNS && cnt < nfd; i++) {
+ if (statp->_u._ext.nsaddrs[i] && statp->_u._ext.nssocks[i] != -1)
+ fds[cnt++] = statp->_u._ext.nssocks[i];
+ }
+ return cnt;
+}
+#endif
+
+
} // namespace __tsan
#endif // #ifdef __linux__