return __dfsw_get_current_dir_name(ret_label);
}
+// This function is only available for glibc 2.25 or newer. Mark it weak so
+// linking succeeds with older glibcs.
+SANITIZER_WEAK_ATTRIBUTE int getentropy(void *buffer, size_t length);
+
+SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_getentropy(void *buffer, size_t length,
+ dfsan_label buffer_label,
+ dfsan_label length_label,
+ dfsan_label *ret_label) {
+ int ret = getentropy(buffer, length);
+ if (ret == 0) {
+ dfsan_set_label(0, buffer, length);
+ }
+ *ret_label = 0;
+ return ret;
+}
+
+SANITIZER_INTERFACE_ATTRIBUTE int __dfso_getentropy(void *buffer, size_t length,
+ dfsan_label buffer_label,
+ dfsan_label length_label,
+ dfsan_label *ret_label,
+ dfsan_origin buffer_origin,
+ dfsan_origin length_origin,
+ dfsan_origin *ret_origin) {
+ return __dfsw_getentropy(buffer, length, buffer_label, length_label,
+ ret_label);
+}
+
SANITIZER_INTERFACE_ATTRIBUTE
int __dfsw_gethostname(char *name, size_t len, dfsan_label name_label,
dfsan_label len_label, dfsan_label *ret_label) {
#define ASSERT_SAVED_N_ORIGINS(val, n)
#endif
+#if !defined(__GLIBC_PREREQ)
+# define __GLIBC_PREREQ(a, b) 0
+#endif
+
void test_stat() {
int i = 1;
dfsan_set_label(i_label, &i, sizeof(i));
ASSERT_ZERO_LABEL(ret);
}
+void test_getentropy() {
+ char buf[64];
+ dfsan_set_label(i_label, buf + 2, 2);
+ DEFINE_AND_SAVE_ORIGINS(buf)
+#if __GLIBC_PREREQ(2, 25)
+ // glibc >= 2.25 has getentropy()
+ int ret = getentropy(buf, sizeof(buf));
+ ASSERT_ZERO_LABEL(ret);
+ if (ret == 0) {
+ ASSERT_READ_ZERO_LABEL(buf + 2, 2);
+ ASSERT_SAVED_ORIGINS(buf)
+ }
+#endif
+}
+
void test_gethostname() {
char buf[1024];
dfsan_set_label(i_label, buf + 2, 2);
test_fstat();
test_get_current_dir_name();
test_getcwd();
+ test_getentropy();
test_gethostname();
test_getpeername();
test_getpwuid_r();