summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLorenzo Martignoni <martignlo@google.com>2013-12-18 19:25:34 +0000
committerLorenzo Martignoni <martignlo@google.com>2013-12-18 19:25:34 +0000
commit52294ad4ed9d38473c6ad2485bcba6a1553ad2e8 (patch)
tree65110f606899d1a08b97a8a4e5c3d4316b79bd15 /lib
parent627e62b80414416b2e84a8fc5d2e06292b58e718 (diff)
[DFSan] New custom wrappers
Added the following custom wrappers: strstr strrchr memchr nanosleep socketpair Tweaked a couple of existing wrappers: if a wrapper returns a pointers derived from an input pointer, then return the label of the input pointer Sorted tests invocation Differential Revision: D2354 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@197601 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/dfsan/dfsan_custom.cc84
-rw-r--r--lib/dfsan/done_abilist.txt5
-rw-r--r--lib/dfsan/lit_tests/custom.c144
3 files changed, 209 insertions, 24 deletions
diff --git a/lib/dfsan/dfsan_custom.cc b/lib/dfsan/dfsan_custom.cc
index 0178a6e25..b4b97aa27 100644
--- a/lib/dfsan/dfsan_custom.cc
+++ b/lib/dfsan/dfsan_custom.cc
@@ -70,7 +70,8 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strchr(const char *s, int c,
if (flags().strict_data_dependencies) {
*ret_label = s_label;
} else {
- *ret_label = dfsan_union(dfsan_read_label(s, i + 1), c_label);
+ *ret_label = dfsan_union(dfsan_read_label(s, i + 1),
+ dfsan_union(s_label, c_label));
}
return s[i] == 0 ? 0 : const_cast<char *>(s+i);
}
@@ -258,7 +259,7 @@ __dfsw_strncpy(char *s1, const char *s2, size_t n, dfsan_label s1_label,
dfsan_memcpy(s1, s2, n);
}
- *ret_label = 0;
+ *ret_label = s1_label;
return s1;
}
@@ -720,4 +721,83 @@ int __dfsw_gettimeofday(struct timeval *tv, struct timezone *tz,
*ret_label = 0;
return ret;
}
+
+SANITIZER_INTERFACE_ATTRIBUTE void *__dfsw_memchr(void *s, int c, size_t n,
+ dfsan_label s_label,
+ dfsan_label c_label,
+ dfsan_label n_label,
+ dfsan_label *ret_label) {
+ void *ret = memchr(s, c, n);
+ if (flags().strict_data_dependencies) {
+ *ret_label = ret ? s_label : 0;
+ } else {
+ size_t len =
+ ret ? reinterpret_cast<char *>(ret) - reinterpret_cast<char *>(s) + 1
+ : n;
+ *ret_label =
+ dfsan_union(dfsan_read_label(s, len), dfsan_union(s_label, c_label));
+ }
+ return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strrchr(char *s, int c,
+ dfsan_label s_label,
+ dfsan_label c_label,
+ dfsan_label *ret_label) {
+ char *ret = strrchr(s, c);
+ if (flags().strict_data_dependencies) {
+ *ret_label = ret ? s_label : 0;
+ } else {
+ *ret_label =
+ dfsan_union(dfsan_read_label(s, strlen(s) + 1),
+ dfsan_union(s_label, c_label));
+ }
+
+ return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strstr(char *haystack, char *needle,
+ dfsan_label haystack_label,
+ dfsan_label needle_label,
+ dfsan_label *ret_label) {
+ char *ret = strstr(haystack, needle);
+ if (flags().strict_data_dependencies) {
+ *ret_label = ret ? haystack_label : 0;
+ } else {
+ size_t len = ret ? ret + strlen(needle) - haystack : strlen(haystack) + 1;
+ *ret_label =
+ dfsan_union(dfsan_read_label(haystack, len),
+ dfsan_union(dfsan_read_label(needle, strlen(needle) + 1),
+ dfsan_union(haystack_label, needle_label)));
+ }
+
+ return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_nanosleep(const struct timespec *req,
+ struct timespec *rem,
+ dfsan_label req_label,
+ dfsan_label rem_label,
+ dfsan_label *ret_label) {
+ int ret = nanosleep(req, rem);
+ *ret_label = 0;
+ if (ret == -1) {
+ // Interrupted by a signal, rem is filled with the remaining time.
+ dfsan_set_label(0, rem, sizeof(struct timespec));
+ }
+ return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE int
+__dfsw_socketpair(int domain, int type, int protocol, int sv[2],
+ dfsan_label domain_label, dfsan_label type_label,
+ dfsan_label protocol_label, dfsan_label sv_label,
+ dfsan_label *ret_label) {
+ int ret = socketpair(domain, type, protocol, sv);
+ *ret_label = 0;
+ if (ret == 0) {
+ dfsan_set_label(0, sv, sizeof(sv));
+ }
+ return ret;
+}
}
diff --git a/lib/dfsan/done_abilist.txt b/lib/dfsan/done_abilist.txt
index 146cd1cbb..51b8212be 100644
--- a/lib/dfsan/done_abilist.txt
+++ b/lib/dfsan/done_abilist.txt
@@ -154,8 +154,10 @@ fun:get_current_dir_name=custom
fun:gethostname=custom
fun:getrlimit=custom
fun:getrusage=custom
+fun:nanosleep=custom
fun:pread=custom
fun:read=custom
+fun:socketpair=custom
fun:stat=custom
fun:time=custom
@@ -177,6 +179,7 @@ fun:strtoull=custom
# Functions that produce an output that is computed from the input, but is not
# necessarily data dependent.
+fun:memchr=custom
fun:memcmp=custom
fun:strcasecmp=custom
fun:strchr=custom
@@ -184,6 +187,8 @@ fun:strcmp=custom
fun:strlen=custom
fun:strncasecmp=custom
fun:strncmp=custom
+fun:strrchr=custom
+fun:strstr=custom
# Functions that take a callback (wrap the callback manually).
fun:dl_iterate_phdr=custom
diff --git a/lib/dfsan/lit_tests/custom.c b/lib/dfsan/lit_tests/custom.c
index b40023370..36bf70a7a 100644
--- a/lib/dfsan/lit_tests/custom.c
+++ b/lib/dfsan/lit_tests/custom.c
@@ -605,6 +605,103 @@ void test_dl_iterate_phdr() {
dl_iterate_phdr(dl_iterate_phdr_test_cb, (void *)3);
}
+void test_strrchr() {
+ char str1[] = "str1str1";
+ dfsan_set_label(i_label, &str1[7], 1);
+
+ char *rv = strrchr(str1, 'r');
+ assert(rv == &str1[6]);
+#ifdef STRICT_DATA_DEPENDENCIES
+ ASSERT_ZERO_LABEL(rv);
+#else
+ ASSERT_LABEL(rv, i_label);
+#endif
+}
+
+void test_strstr() {
+ char str1[] = "str1str1";
+ dfsan_set_label(i_label, &str1[3], 1);
+ dfsan_set_label(j_label, &str1[5], 1);
+
+ char *rv = strstr(str1, "1s");
+ assert(rv == &str1[3]);
+#ifdef STRICT_DATA_DEPENDENCIES
+ ASSERT_ZERO_LABEL(rv);
+#else
+ ASSERT_LABEL(rv, i_label);
+#endif
+
+ rv = strstr(str1, "2s");
+ assert(rv == NULL);
+#ifdef STRICT_DATA_DEPENDENCIES
+ ASSERT_ZERO_LABEL(rv);
+#else
+ ASSERT_LABEL(rv, i_j_label);
+#endif
+}
+
+void test_memchr() {
+ char str1[] = "str1";
+ dfsan_set_label(i_label, &str1[3], 1);
+ dfsan_set_label(j_label, &str1[4], 1);
+
+ char *crv = memchr(str1, 'r', sizeof(str1));
+ assert(crv == &str1[2]);
+ ASSERT_ZERO_LABEL(crv);
+
+ crv = memchr(str1, '1', sizeof(str1));
+ assert(crv == &str1[3]);
+#ifdef STRICT_DATA_DEPENDENCIES
+ ASSERT_ZERO_LABEL(crv);
+#else
+ ASSERT_LABEL(crv, i_label);
+#endif
+
+ crv = memchr(str1, 'x', sizeof(str1));
+ assert(!crv);
+#ifdef STRICT_DATA_DEPENDENCIES
+ ASSERT_ZERO_LABEL(crv);
+#else
+ ASSERT_LABEL(crv, i_j_label);
+#endif
+}
+
+void alarm_handler(int unused) {
+ ;
+}
+
+void test_nanosleep() {
+ struct timespec req, rem;
+ req.tv_sec = 1;
+ req.tv_nsec = 0;
+ dfsan_set_label(i_label, &rem, sizeof(rem));
+
+ // non interrupted
+ int rv = nanosleep(&req, &rem);
+ assert(rv == 0);
+ ASSERT_ZERO_LABEL(rv);
+ ASSERT_READ_LABEL(&rem, 1, i_label);
+
+ // interrupted by an alarm
+ signal(SIGALRM, alarm_handler);
+ req.tv_sec = 3;
+ alarm(1);
+ rv = nanosleep(&req, &rem);
+ assert(rv == -1);
+ ASSERT_ZERO_LABEL(rv);
+ ASSERT_READ_ZERO_LABEL(&rem, sizeof(rem));
+}
+
+void test_socketpair() {
+ int fd[2];
+
+ dfsan_set_label(i_label, fd, sizeof(fd));
+ int rv = socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
+ assert(rv == 0);
+ ASSERT_ZERO_LABEL(rv);
+ ASSERT_READ_ZERO_LABEL(fd, sizeof(fd));
+}
+
int main(void) {
i_label = dfsan_create_label("i", 0);
j_label = dfsan_create_label("j", 0);
@@ -612,47 +709,50 @@ int main(void) {
test_calloc();
test_clock_gettime();
+ test_ctime_r();
+ test_dl_iterate_phdr();
test_dlopen();
+ test_fgets();
test_fstat();
+ test_get_current_dir_name();
+ test_getcwd();
+ test_gethostname();
+ test_getpwuid_r();
+ test_getrlimit();
+ test_getrusage();
+ test_gettimeofday();
+ test_inet_pton();
+ test_localtime_r();
+ test_memchr();
test_memcmp();
test_memcpy();
test_memset();
+ test_nanosleep();
+ test_poll();
test_pread();
+ test_pthread_create();
test_read();
+ test_sched_getaffinity();
+ test_select();
+ test_sigaction();
+ test_sigemptyset();
+ test_socketpair();
test_stat();
test_strcasecmp();
test_strchr();
test_strcmp();
+ test_strcpy();
test_strdup();
test_strlen();
test_strncasecmp();
test_strncmp();
test_strncpy();
-
- test_ctime_r();
- test_fgets();
- test_getcwd();
- test_get_current_dir_name();
- test_gethostname();
- test_getrlimit();
- test_getrusage();
- test_strcpy();
+ test_strrchr();
+ test_strstr();
+ test_strtod();
test_strtol();
test_strtoll();
- test_strtod();
test_strtoul();
test_strtoull();
test_time();
- test_inet_pton();
- test_localtime_r();
- test_getpwuid_r();
- test_poll();
- test_select();
- test_sched_getaffinity();
- test_sigemptyset();
- test_sigaction();
- test_gettimeofday();
-
- test_pthread_create();
- test_dl_iterate_phdr();
}