[compiler-rt] r350658 - [Sanitizer] Intercept fdevname on FreeBSD

David Carlier via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 8 13:49:38 PST 2019


Author: devnexen
Date: Tue Jan  8 13:49:37 2019
New Revision: 350658

URL: http://llvm.org/viewvc/llvm-project?rev=350658&view=rev
Log:
[Sanitizer] Intercept fdevname on FreeBSD

- Is a file descriptor flavor FreeBSD's specific.
- reentrant version included.

Reviewers: vitalybuka, krytarowski, emaste

Reviewed By: emaste

Differential Revision: https://reviews.llvm.org/D56268

Added:
    compiler-rt/trunk/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc
Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=350658&r1=350657&r2=350658&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Tue Jan  8 13:49:37 2019
@@ -9347,6 +9347,40 @@ INTERCEPTOR(__sanitizer_FILE *, funopen2
 #define INIT_FUNOPEN2
 #endif
 
+#if SANITIZER_INTERCEPT_FDEVNAME
+INTERCEPTOR(char *, fdevname,  int fd) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, fdevname, fd);
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
+  char *name = REAL(fdevname)(fd);
+  if (name) {
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, REAL(strlen)(name) + 1);
+    if (fd > 0)
+      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
+  }
+  return name;
+}
+
+INTERCEPTOR(char *, fdevname_r,  int fd, char *buf, SIZE_T len) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, fdevname_r, fd, buf, len);
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
+  char *name = REAL(fdevname_r)(fd, buf, len);
+  if (name && buf && len > 0) {
+    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, REAL(strlen)(buf) + 1);
+    if (fd > 0)
+      COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
+  }
+  return name;
+}
+
+#define INIT_FDEVNAME \
+  COMMON_INTERCEPT_FUNCTION(fdevname); \
+  COMMON_INTERCEPT_FUNCTION(fdevname_r);
+#else
+#define INIT_FDEVNAME
+#endif
+
 static void InitializeCommonInterceptors() {
   static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
   interceptor_metadata_map =
@@ -9634,6 +9668,7 @@ static void InitializeCommonInterceptors
   INIT_PCLOSE;
   INIT_FUNOPEN;
   INIT_FUNOPEN2;
+  INIT_FDEVNAME;
 
   INIT___PRINTF_CHK;
 }

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h?rev=350658&r1=350657&r2=350658&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_platform_interceptors.h Tue Jan  8 13:49:37 2019
@@ -547,6 +547,7 @@
 #define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD)
 #define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC)
 #define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD)
+#define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD
 
 #define SANITIZER_INTERCEPT_POPEN SI_POSIX
 #define SANITIZER_INTERCEPT_POPENVE SI_NETBSD

Added: compiler-rt/trunk/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc?rev=350658&view=auto
==============================================================================
--- compiler-rt/trunk/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc (added)
+++ compiler-rt/trunk/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc Tue Jan  8 13:49:37 2019
@@ -0,0 +1,44 @@
+// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+void test_fdevname() {
+  int fd = open("/dev/null", O_RDONLY);
+  char *name;
+  
+  printf("test_fdevname\n");
+  assert(fd != -1);
+  assert((name = fdevname(fd)));
+  close(fd);
+
+  printf("%s\n", name);
+}
+
+void test_fdevname_r() {
+  int fd = open("/dev/null", O_RDONLY);
+  char *name;
+  char buf[5];
+
+  printf("test_fdevname_r\n");
+  assert(fd != -1);
+  assert((name = fdevname_r(fd, buf, sizeof(buf))));
+  close(fd);
+
+  printf("%s\n", name);
+}
+
+int main(void) {
+  test_fdevname();
+  test_fdevname_r();
+  // CHECK: test_fdevname
+  // CHECK: null
+  // CHECK: test_fdevname_r
+  // CHECK: null
+
+  return 0;
+}




More information about the llvm-commits mailing list