diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-02-04 10:16:50 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-02-04 10:16:50 +0000 |
commit | 2c5cbd2b387f67d74fe08f9a3df163186b156e67 (patch) | |
tree | 36bc2dd3297492ed50a41d549cf617ee569abbf4 /compiler-rt/lib | |
parent | 88b95872935719214fdd45760df33942cceec42f (diff) | |
download | bcm5719-llvm-2c5cbd2b387f67d74fe08f9a3df163186b156e67.tar.gz bcm5719-llvm-2c5cbd2b387f67d74fe08f9a3df163186b156e67.zip |
[Sanitizer] extend internal libc with stat/fstat/lstat functions
llvm-svn: 174316
Diffstat (limited to 'compiler-rt/lib')
6 files changed, 99 insertions, 30 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h index 911f5af3a4c..6bdca3c9b16 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_libc.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_libc.h @@ -71,6 +71,10 @@ fd_t internal_open(const char *filename, int flags, u32 mode); uptr internal_read(fd_t fd, void *buf, uptr count); uptr internal_write(fd_t fd, const void *buf, uptr count); uptr internal_filesize(fd_t fd); // -1 on error. +int internal_stat(const char *path, void *buf); +int internal_lstat(const char *path, void *buf); +int internal_fstat(fd_t fd, void *buf); + int internal_dup2(int oldfd, int newfd); uptr internal_readlink(const char *path, char *buf, uptr bufsize); int internal_snprintf(char *buffer, uptr length, const char *format, ...); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index f5edbf01a27..70f330aa9b3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -93,16 +93,38 @@ uptr internal_write(fd_t fd, const void *buf, uptr count) { return res; } +int internal_stat(const char *path, void *buf) { +#if SANITIZER_LINUX_USES_64BIT_SYSCALLS + return syscall(__NR_stat, path, buf); +#else + return syscall(__NR_stat64, path, buf); +#endif +} + +int internal_lstat(const char *path, void *buf) { +#if SANITIZER_LINUX_USES_64BIT_SYSCALLS + return syscall(__NR_lstat, path, buf); +#else + return syscall(__NR_lstat64, path, buf); +#endif +} + +int internal_fstat(fd_t fd, void *buf) { +#if SANITIZER_LINUX_USES_64BIT_SYSCALLS + return syscall(__NR_fstat, fd, buf); +#else + return syscall(__NR_fstat64, fd, buf); +#endif +} + uptr internal_filesize(fd_t fd) { #if SANITIZER_LINUX_USES_64BIT_SYSCALLS struct stat st; - if (syscall(__NR_fstat, fd, &st)) - return -1; #else struct stat64 st; - if (syscall(__NR_fstat64, fd, &st)) - return -1; #endif + if (internal_fstat(fd, &st)) + return -1; return (uptr)st.st_size; } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc index a7bde030965..1bd50ca1d06 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc @@ -69,9 +69,21 @@ uptr internal_write(fd_t fd, const void *buf, uptr count) { return write(fd, buf, count); } +int internal_stat(const char *path, void *buf) { + return stat(path, buf); +} + +int internal_lstat(const char *path, void *buf) { + return lstat(path, buf); +} + +int internal_fstat(fd_t fd, void *buf) { + return fstat(fd, buf); +} + uptr internal_filesize(fd_t fd) { struct stat st; - if (fstat(fd, &st)) + if (internal_fstat(fd, &st)) return -1; return (uptr)st.st_size; } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cc b/compiler-rt/lib/sanitizer_common/sanitizer_win.cc index 28bf8dbf1c5..c91d5e30f7e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cc @@ -219,6 +219,18 @@ uptr internal_write(fd_t fd, const void *buf, uptr count) { return ret; } +int internal_stat(const char *path, void *buf) { + UNIMPLEMENTED(); +} + +int internal_lstat(const char *path, void *buf) { + UNIMPLEMENTED(); +} + +int internal_fstat(fd_t fd, void *buf) { + UNIMPLEMENTED(); +} + uptr internal_filesize(fd_t fd) { UNIMPLEMENTED(); } diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_libc_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_libc_test.cc index b9d8414e0cb..6616f42232f 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_libc_test.cc +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_libc_test.cc @@ -9,9 +9,17 @@ // Tests for sanitizer_libc.h. //===----------------------------------------------------------------------===// +#include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_libc.h" #include "gtest/gtest.h" +#if defined(__linux__) || defined(__APPLE__) +# define SANITIZER_TEST_HAS_STAT_H 1 +# include <sys/stat.h> +#else +# define SANITIZER_TEST_HAS_STAT_H 0 +#endif + // A regression test for internal_memmove() implementation. TEST(SanitizerCommon, InternalMemmoveRegression) { char src[] = "Hello World"; @@ -40,3 +48,39 @@ TEST(SanitizerCommon, mem_is_zero) { } delete [] x; } + +TEST(SanitizerCommon, FileOps) { + const char *str1 = "qwerty"; + uptr len1 = internal_strlen(str1); + const char *str2 = "zxcv"; + uptr len2 = internal_strlen(str2); + + const char kTempFileName[] = "/tmp/sanitizer_common.tmp"; + fd_t fd = OpenFile(kTempFileName, true); + EXPECT_NE(fd, kInvalidFd); + EXPECT_EQ(len1, internal_write(fd, str1, len1)); + EXPECT_EQ(len2, internal_write(fd, str2, len2)); + internal_close(fd); + + fd = OpenFile(kTempFileName, false); + EXPECT_NE(fd, kInvalidFd); + uptr fsize = internal_filesize(fd); + EXPECT_EQ(len1 + len2, fsize); + +#if SANITIZER_TEST_HAS_STAT_H + struct stat st1, st2, st3; + EXPECT_EQ(0, internal_stat(kTempFileName, &st1)); + EXPECT_EQ(0, internal_lstat(kTempFileName, &st2)); + EXPECT_EQ(0, internal_fstat(fd, &st3)); + EXPECT_EQ(fsize, (uptr)st3.st_size); +#endif + + char buf[64] = {}; + EXPECT_EQ(len1, internal_read(fd, buf, len1)); + EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); + EXPECT_EQ((char)0, buf[len1 + 1]); + internal_memset(buf, 0, len1); + EXPECT_EQ(len2, internal_read(fd, buf, len2)); + EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); + internal_close(fd); +} diff --git a/compiler-rt/lib/tsan/tests/unit/tsan_platform_test.cc b/compiler-rt/lib/tsan/tests/unit/tsan_platform_test.cc index d47a325667e..733cc54d3e9 100644 --- a/compiler-rt/lib/tsan/tests/unit/tsan_platform_test.cc +++ b/compiler-rt/lib/tsan/tests/unit/tsan_platform_test.cc @@ -61,29 +61,4 @@ TEST(Platform, ThreadInfoWorker) { pthread_join(t, 0); } -TEST(Platform, FileOps) { - const char *str1 = "qwerty"; - uptr len1 = internal_strlen(str1); - const char *str2 = "zxcv"; - uptr len2 = internal_strlen(str2); - - fd_t fd = OpenFile("./tsan_test.tmp", true); - EXPECT_NE(fd, kInvalidFd); - EXPECT_EQ(len1, internal_write(fd, str1, len1)); - EXPECT_EQ(len2, internal_write(fd, str2, len2)); - internal_close(fd); - - fd = OpenFile("./tsan_test.tmp", false); - EXPECT_NE(fd, kInvalidFd); - EXPECT_EQ(len1 + len2, internal_filesize(fd)); - char buf[64] = {}; - EXPECT_EQ(len1, internal_read(fd, buf, len1)); - EXPECT_EQ(0, internal_memcmp(buf, str1, len1)); - EXPECT_EQ((char)0, buf[len1 + 1]); - internal_memset(buf, 0, len1); - EXPECT_EQ(len2, internal_read(fd, buf, len2)); - EXPECT_EQ(0, internal_memcmp(buf, str2, len2)); - internal_close(fd); -} - } // namespace __tsan |