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