12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_dfsan -m64 %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_dfsan -mllvm -dfsan-args-abi -m64 %s -o %t && DFSAN_OPTIONS="strict_data_dependencies=0" %run %t 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES -m64 %s -o %t && %run %t 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_dfsan -DSTRICT_DATA_DEPENDENCIES -mllvm -dfsan-args-abi -m64 %s -o %t && %run %t 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Tests custom implementations of various glibc functions. 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define _GNU_SOURCE 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sanitizer/dfsan_interface.h> 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <arpa/inet.h> 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h> 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <fcntl.h> 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <link.h> 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <poll.h> 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pthread.h> 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pwd.h> 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sched.h> 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <signal.h> 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h> 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/select.h> 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/resource.h> 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/stat.h> 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/time.h> 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/types.h> 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <time.h> 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h> 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdfsan_label i_label = 0; 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdfsan_label j_label = 0; 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdfsan_label k_label = 0; 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdfsan_label i_j_label = 0; 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define ASSERT_ZERO_LABEL(data) \ 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(0 == dfsan_get_label((long) (data))) 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define ASSERT_READ_ZERO_LABEL(ptr, size) \ 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(0 == dfsan_read_label(ptr, size)) 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define ASSERT_LABEL(data, label) \ 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(label == dfsan_get_label((long) (data))) 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define ASSERT_READ_LABEL(ptr, size, label) \ 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(label == dfsan_read_label(ptr, size)) 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_stat() { 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int i = 1; 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &i, sizeof(i)); 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct stat s; 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.st_dev = i; 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(0 == stat("/", &s)); 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(s.st_dev); 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.st_dev = i; 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(-1 == stat("/nonexistent", &s)); 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(s.st_dev, i_label); 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_fstat() { 632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int i = 1; 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &i, sizeof(i)); 652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct stat s; 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd = open("/dev/zero", O_RDONLY); 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines s.st_dev = i; 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = fstat(fd, &s); 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(0 == rv); 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(s.st_dev); 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_memcmp() { 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1", str2[] = "str2"; 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str2[3], 1); 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = memcmp(str1, str2, sizeof(str1)); 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv < 0); 812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_j_label); 852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_memcpy() { 892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str2[sizeof(str1)]; 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(memcpy(str2, str1, sizeof(str1))); 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(0 == memcmp(str2, str1, sizeof(str1))); 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(str2[0]); 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(str2[3], i_label); 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_memset() { 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[8]; 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int j = 'a'; 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &j, sizeof(j)); 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(memset(&buf, j, sizeof(buf))); 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < 8; ++i) { 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(buf[i], j_label); 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(buf[i] == 'a'); 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strcmp() { 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1", str2[] = "str2"; 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str2[3], 1); 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = strcmp(str1, str2); 1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv < 0); 1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_j_label); 1222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strlen() { 1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = strlen(str1); 1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 4); 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 1342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_label); 1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strdup() { 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *strd = strdup(str1); 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[0]); 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(strd[3], i_label); 1452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(strd); 1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strncpy() { 1492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 1502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str2[sizeof(str1)]; 1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *strd = strncpy(str2, str1, 5); 1542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strd == str2); 1552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strcmp(str1, str2) == 0); 1562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd); 1572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[0]); 1582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[1]); 1592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[2]); 1602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(strd[3], i_label); 1612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines strd = strncpy(str2, str1, 3); 1632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strd == str2); 1642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strncmp(str1, str2, 3) == 0); 1652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd); 1662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[0]); 1672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[1]); 1682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(strd[2]); 1692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strncmp() { 1722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1", str2[] = "str2"; 1732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str2[3], 1); 1752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = strncmp(str1, str2, sizeof(str1)); 1772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv < 0); 1782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 1792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 1802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 1812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, dfsan_union(i_label, j_label)); 1822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines rv = strncmp(str1, str2, 3); 1852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 0); 1862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 1872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strcasecmp() { 1902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1", str2[] = "str2", str3[] = "Str1"; 1912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 1922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str2[3], 1); 1932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str3[2], 1); 1942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = strcasecmp(str1, str2); 1962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv < 0); 1972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 1982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, dfsan_union(i_label, j_label)); 2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines rv = strcasecmp(str1, str3); 2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 0); 2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, dfsan_union(i_label, j_label)); 2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strncasecmp() { 2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "Str1", str2[] = "str2"; 2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str2[3], 1); 2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = strncasecmp(str1, str2, sizeof(str1)); 2182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv < 0); 2192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 2202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 2212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, dfsan_union(i_label, j_label)); 2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 2242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines rv = strncasecmp(str1, str2, 3); 2262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 0); 2272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 2282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strchr() { 2312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 2322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 2332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *crv = strchr(str1, 'r'); 2352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(crv == &str1[2]); 2362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 2372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines crv = strchr(str1, '1'); 2392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(crv == &str1[3]); 2402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 2412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 2422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 2432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(crv, i_label); 2442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 2452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines crv = strchr(str1, 'x'); 2472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(!crv); 2482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 2492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 2502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 2512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(crv, i_label); 2522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 2532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_calloc() { 2562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // With any luck this sequence of calls will cause calloc to return the same 2572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // pointer both times. This is probably the best we can do to test this 2582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // function. 2592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *crv = calloc(4096, 1); 2602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv[0]); 2612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, crv, 100); 2622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(crv); 2632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines crv = calloc(4096, 1); 2652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv[0]); 2662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines free(crv); 2672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_read() { 2702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[16]; 2712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf, 1); 2722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 15, 1); 2732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(buf[0], i_label); 2752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(buf[15], j_label); 2762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd = open("/dev/zero", O_RDONLY); 2782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = read(fd, buf, sizeof(buf)); 2792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == sizeof(buf)); 2802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 2812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(buf[0]); 2822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(buf[15]); 2832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines close(fd); 2842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 2852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_pread() { 2872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[16]; 2882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf, 1); 2892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 15, 1); 2902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(buf[0], i_label); 2922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(buf[15], j_label); 2932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 2942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd = open("/bin/sh", O_RDONLY); 2952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = pread(fd, buf, sizeof(buf), 0); 2962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == sizeof(buf)); 2972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(buf[0]); 2992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(buf[15]); 3002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines close(fd); 3012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_dlopen() { 3042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *map = dlopen(NULL, RTLD_NOW); 3052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(map); 3062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(map); 3072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dlclose(map); 3082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines map = dlopen("/nonexistent", RTLD_NOW); 3092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(!map); 3102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(map); 3112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_clock_gettime() { 3142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct timespec tp; 3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, ((char *)&tp) + 3, 1); 3162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int t = clock_gettime(CLOCK_REALTIME, &tp); 3172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(t == 0); 3182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(t); 3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(((char *)&tp)[3]); 3202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_ctime_r() { 3232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *buf = (char*) malloc(64); 3242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines time_t t = 0; 3252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *ret = ctime_r(&t, buf); 3272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(ret); 3282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(buf == ret); 3292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(buf, strlen(buf) + 1); 3302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &t, sizeof(t)); 3322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret = ctime_r(&t, buf); 3332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(ret); 3342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(buf, strlen(buf) + 1, i_label); 3352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines t = 0; 3372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &buf, sizeof(&buf)); 3382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret = ctime_r(&t, buf); 3392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, j_label); 3402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(buf, strlen(buf) + 1); 3412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic int write_callback_count = 0; 3442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic int last_fd; 3452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic const void *last_buf; 3462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic size_t last_count; 3472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid write_callback(int fd, const void *buf, size_t count) { 3492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines write_callback_count++; 3502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines last_fd = fd; 3522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines last_buf = buf; 3532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines last_count = count; 3542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_dfsan_set_write_callback() { 3572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "Sample chars"; 3582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int buf_len = strlen(buf); 3592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd = open("/dev/null", O_WRONLY); 3612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_write_callback(write_callback); 3632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines write_callback_count = 0; 3652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Callback should be invoked on every call to write(). 3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = write(fd, buf, buf_len); 3682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(write_callback_count == 1); 3692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&res, sizeof(res)); 3702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&last_fd, sizeof(last_fd)); 3712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(last_buf, sizeof(last_buf)); 3722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&last_count, sizeof(last_count)); 3732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Add a label to write() arguments. Check that the labels are readable from 3752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // the values passed to the callback. 3762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &fd, sizeof(fd)); 3772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &(buf[3]), 1); 3782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(k_label, &buf_len, sizeof(buf_len)); 3792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = write(fd, buf, buf_len); 3812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(write_callback_count == 2); 3822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&res, sizeof(res)); 3832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(&last_fd, sizeof(last_fd), i_label); 3842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(&last_buf[3], sizeof(last_buf[3]), j_label); 3852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(last_buf, sizeof(last_buf), j_label); 3862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(&last_count, sizeof(last_count), k_label); 3872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_write_callback(NULL); 3892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_fgets() { 3922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *buf = (char*) malloc(128); 3932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *f = fopen("/etc/passwd", "r"); 3942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf, 1); 3952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *ret = fgets(buf, sizeof(buf), f); 3962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == buf); 3972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(ret); 3982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(buf, 128); 3992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &buf, sizeof(&buf)); 4002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret = fgets(buf, sizeof(buf), f); 4012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, j_label); 4022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fclose(f); 4032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_getcwd() { 4062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[1024]; 4072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *ptr = buf; 4082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 2, 2); 4092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char* ret = getcwd(buf, sizeof(buf)); 4102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == buf); 4112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret[0] == '/'); 4122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(buf + 2, 2); 4132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &ptr, sizeof(ptr)); 4142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ret = getcwd(ptr, sizeof(buf)); 4152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_label); 4162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_get_current_dir_name() { 4192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char* ret = get_current_dir_name(); 4202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret); 4212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret[0] == '/'); 4222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(ret, strlen(ret) + 1); 4232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_gethostname() { 4262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[1024]; 4272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 2, 2); 4282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(gethostname(buf, sizeof(buf)) == 0); 4292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(buf + 2, 2); 4302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_getrlimit() { 4332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct rlimit rlim; 4342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &rlim, sizeof(rlim)); 4352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(getrlimit(RLIMIT_CPU, &rlim) == 0); 4362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&rlim, sizeof(rlim)); 4372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_getrusage() { 4402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct rusage usage; 4412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &usage, sizeof(usage)); 4422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(getrusage(RUSAGE_SELF, &usage) == 0); 4432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&usage, sizeof(usage)); 4442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strcpy() { 4472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char src[] = "hello world"; 4482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char dst[sizeof(src) + 2]; 4492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(0, src, sizeof(src)); 4502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(0, dst, sizeof(dst)); 4512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, src + 2, 1); 4522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, src + 3, 1); 4532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, dst + 4, 1); 4542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, dst + 12, 1); 4552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *ret = strcpy(dst, src); 4562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == dst); 4572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strcmp(src, dst) == 0); 4582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < strlen(src) + 1; ++i) { 4592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(dfsan_get_label(dst[i]) == dfsan_get_label(src[i])); 4602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Note: if strlen(src) + 1 were used instead to compute the first untouched 4622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // byte of dest, the label would be I|J. This is because strlen() might 4632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // return a non-zero label, and because by default pointer labels are not 4642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // ignored on loads. 4652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(dst[12], i_label); 4662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strtol() { 4692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "1234578910"; 4702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *endptr = NULL; 4712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 1, 1); 4722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 10, 1); 4732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines long int ret = strtol(buf, &endptr, 10); 4742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 1234578910); 4752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(endptr == buf + 10); 4762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_j_label); 4772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strtoll() { 4802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "1234578910 "; 4812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *endptr = NULL; 4822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 1, 1); 4832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 2, 1); 4842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines long long int ret = strtoll(buf, &endptr, 10); 4852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 1234578910); 4862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(endptr == buf + 10); 4872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_j_label); 4882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strtoul() { 4912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "0xffffffffffffaa"; 4922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *endptr = NULL; 4932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 1, 1); 4942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 2, 1); 4952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines long unsigned int ret = strtol(buf, &endptr, 16); 4962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 72057594037927850); 4972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(endptr == buf + 16); 4982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_j_label); 4992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strtoull() { 5022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "0xffffffffffffffaa"; 5032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *endptr = NULL; 5042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 1, 1); 5052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 2, 1); 5062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines long long unsigned int ret = strtoull(buf, &endptr, 16); 5072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0xffffffffffffffaa); 5082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(endptr == buf + 18); 5092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_j_label); 5102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strtod() { 5132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "12345.76 foo"; 5142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *endptr = NULL; 5152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, buf + 1, 1); 5162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, buf + 6, 1); 5172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines double ret = strtod(buf, &endptr); 5182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 12345.76); 5192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(endptr == buf + 8); 5202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(ret, i_j_label); 5212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_time() { 5242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines time_t t = 0; 5252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &t, 1); 5262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines time_t ret = time(&t); 5272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == t); 5282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret > 0); 5292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(t); 5302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_inet_pton() { 5332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char addr4[] = "127.0.0.1"; 5342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, addr4 + 3, 1); 5352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct in_addr in4; 5362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret4 = inet_pton(AF_INET, addr4, &in4); 5372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret4 == 1); 5382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(&in4, sizeof(in4), i_label); 5392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(in4.s_addr == 0x0100007f); 5402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char addr6[] = "::1"; 5422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, addr6 + 3, 1); 5432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct in6_addr in6; 5442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret6 = inet_pton(AF_INET6, addr6, &in6); 5452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret6 == 1); 5462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(((char *) &in6) + sizeof(in6) - 1, 1, j_label); 5472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_localtime_r() { 5502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines time_t t0 = 1384800998; 5512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct tm t1; 5522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &t0, sizeof(t0)); 5532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct tm* ret = localtime_r(&t0, &t1); 5542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == &t1); 5552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(t1.tm_min == 56); 5562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(t1.tm_mon, i_label); 5572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_getpwuid_r() { 5602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd pwd; 5612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[1024]; 5622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct passwd *result; 5632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &pwd, 4); 5652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = getpwuid_r(0, &pwd, buf, sizeof(buf), &result); 5662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0); 5672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(strcmp(pwd.pw_name, "root") == 0); 5682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(result == &pwd); 5692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&pwd, 4); 5702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_poll() { 5732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct pollfd fd; 5742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fd.fd = 0; 5752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fd.events = POLLIN; 5762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &fd.revents, sizeof(fd.revents)); 5772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = poll(&fd, 1, 1); 5782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(fd.revents); 5792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret >= 0); 5802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_select() { 5832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct timeval t; 5842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fd_set fds; 5852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines t.tv_sec = 2; 5862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FD_SET(0, &fds); 5872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &fds, sizeof(fds)); 5882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &t, sizeof(t)); 5892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = select(1, &fds, NULL, NULL, &t); 5902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret >= 0); 5912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(t.tv_sec); 5922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&fds, sizeof(fds)); 5932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 5942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 5952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_sched_getaffinity() { 5962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cpu_set_t mask; 5972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &mask, 1); 5982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = sched_getaffinity(0, sizeof(mask), &mask); 5992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0); 6002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&mask, sizeof(mask)); 6012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_sigemptyset() { 6042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sigset_t set; 6052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &set, 1); 6062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = sigemptyset(&set); 6072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0); 6082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&set, sizeof(set)); 6092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_sigaction() { 6122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct sigaction oldact; 6132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &oldact, 1); 6142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = sigaction(SIGUSR1, NULL, &oldact); 6152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0); 6162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&oldact, sizeof(oldact)); 6172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_gettimeofday() { 6202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct timeval tv; 6212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct timezone tz; 6222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &tv, sizeof(tv)); 6232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &tz, sizeof(tz)); 6242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int ret = gettimeofday(&tv, &tz); 6252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(ret == 0); 6262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&tv, sizeof(tv)); 6272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&tz, sizeof(tz)); 6282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *pthread_create_test_cb(void *p) { 6312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(p == (void *)1); 6322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(p); 6332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return (void *)2; 6342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_pthread_create() { 6372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_t pt; 6382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_create(&pt, 0, pthread_create_test_cb, (void *)1); 6392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *cbrv; 6402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_join(pt, &cbrv); 6412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(cbrv == (void *)2); 6422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint dl_iterate_phdr_test_cb(struct dl_phdr_info *info, size_t size, 6452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void *data) { 6462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(data == (void *)3); 6472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(info); 6482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(size); 6492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(data); 6502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 6512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_dl_iterate_phdr() { 6542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dl_iterate_phdr(dl_iterate_phdr_test_cb, (void *)3); 6552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strrchr() { 6582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1str1"; 6592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[7], 1); 6602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *rv = strrchr(str1, 'r'); 6622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == &str1[6]); 6632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 6642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 6652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 6662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_label); 6672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 6682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_strstr() { 6712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1str1"; 6722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 6732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str1[5], 1); 6742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *rv = strstr(str1, "1s"); 6762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == &str1[3]); 6772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 6782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 6792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 6802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_label); 6812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 6822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines rv = strstr(str1, "2s"); 6842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == NULL); 6852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 6862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 6872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 6882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(rv, i_j_label); 6892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 6902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_memchr() { 6932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char str1[] = "str1"; 6942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &str1[3], 1); 6952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &str1[4], 1); 6962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 6972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *crv = memchr(str1, 'r', sizeof(str1)); 6982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(crv == &str1[2]); 6992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 7002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines crv = memchr(str1, '1', sizeof(str1)); 7022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(crv == &str1[3]); 7032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 7042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 7052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 7062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(crv, i_label); 7072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 7082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines crv = memchr(str1, 'x', sizeof(str1)); 7102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(!crv); 7112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef STRICT_DATA_DEPENDENCIES 7122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(crv); 7132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 7142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_LABEL(crv, i_j_label); 7152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 7162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid alarm_handler(int unused) { 7192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ; 7202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_nanosleep() { 7232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct timespec req, rem; 7242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines req.tv_sec = 1; 7252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines req.tv_nsec = 0; 7262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &rem, sizeof(rem)); 7272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // non interrupted 7292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = nanosleep(&req, &rem); 7302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 0); 7312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 7322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_LABEL(&rem, 1, i_label); 7332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // interrupted by an alarm 7352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines signal(SIGALRM, alarm_handler); 7362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines req.tv_sec = 3; 7372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines alarm(1); 7382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines rv = nanosleep(&req, &rem); 7392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == -1); 7402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 7412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(&rem, sizeof(rem)); 7422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_socketpair() { 7452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd[2]; 7462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, fd, sizeof(fd)); 7482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int rv = socketpair(PF_LOCAL, SOCK_STREAM, 0, fd); 7492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(rv == 0); 7502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(rv); 7512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_READ_ZERO_LABEL(fd, sizeof(fd)); 7522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid test_write() { 7552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd = open("/dev/null", O_WRONLY); 7562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char buf[] = "a string"; 7582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int len = strlen(buf); 7592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // The result of a write always unlabeled. 7612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int res = write(fd, buf, len); 7622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines assert(res > 0); 7632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(res); 7642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Label all arguments to write(). 7662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &(buf[3]), 1); 7672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(j_label, &fd, sizeof(fd)); 7682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines dfsan_set_label(i_label, &len, sizeof(len)); 7692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // The value returned by write() should have no label. 7712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines res = write(fd, buf, len); 7722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ASSERT_ZERO_LABEL(res); 7732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines close(fd); 7752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 7762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(void) { 7782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines i_label = dfsan_create_label("i", 0); 7792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines j_label = dfsan_create_label("j", 0); 7802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines k_label = dfsan_create_label("k", 0); 7812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines i_j_label = dfsan_union(i_label, j_label); 7822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 7832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_calloc(); 7842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_clock_gettime(); 7852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_ctime_r(); 7862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_dfsan_set_write_callback(); 7872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_dl_iterate_phdr(); 7882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_dlopen(); 7892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_fgets(); 7902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_fstat(); 7912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_get_current_dir_name(); 7922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_getcwd(); 7932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_gethostname(); 7942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_getpwuid_r(); 7952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_getrlimit(); 7962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_getrusage(); 7972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_gettimeofday(); 7982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_inet_pton(); 7992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_localtime_r(); 8002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_memchr(); 8012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_memcmp(); 8022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_memcpy(); 8032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_memset(); 8042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_nanosleep(); 8052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_poll(); 8062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_pread(); 8072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_pthread_create(); 8082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_read(); 8092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_sched_getaffinity(); 8102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_select(); 8112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_sigaction(); 8122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_sigemptyset(); 8132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_socketpair(); 8142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_stat(); 8152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strcasecmp(); 8162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strchr(); 8172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strcmp(); 8182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strcpy(); 8192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strdup(); 8202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strlen(); 8212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strncasecmp(); 8222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strncmp(); 8232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strncpy(); 8242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strrchr(); 8252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strstr(); 8262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strtod(); 8272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strtol(); 8282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strtoll(); 8292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strtoul(); 8302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_strtoull(); 8312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_time(); 8322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines test_write(); 8332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 834