[compiler-rt] 4155387 - Preadv2 pwritev2 san reapply (#99089)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 16 14:31:34 PDT 2024


Author: David CARLIER
Date: 2024-07-16T22:31:31+01:00
New Revision: 41553876d3cf31e709039cb3ba95d279ae0b217e

URL: https://github.com/llvm/llvm-project/commit/41553876d3cf31e709039cb3ba95d279ae0b217e
DIFF: https://github.com/llvm/llvm-project/commit/41553876d3cf31e709039cb3ba95d279ae0b217e.diff

LOG: Preadv2 pwritev2 san reapply (#99089)

Added: 
    compiler-rt/test/sanitizer_common/TestCases/Linux/preadv2.cpp

Modified: 
    compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
    compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index a6066a6226e1b..032b04a09ae76 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -10264,6 +10264,38 @@ INTERCEPTOR(int, cpuset_getaffinity, int level, int which, __int64_t id, SIZE_T
 #define INIT_CPUSET_GETAFFINITY
 #endif
 
+#if SANITIZER_INTERCEPT_PREADV2
+INTERCEPTOR(SSIZE_T, preadv2, int fd, __sanitizer_iovec *iov, int iovcnt,
+            OFF_T offset, int flags) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, preadv2, fd, iov, iovcnt, offset, flags);
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
+  SSIZE_T res = REAL(preadv2)(fd, iov, iovcnt, offset, flags);
+  if (res > 0) write_iovec(ctx, iov, iovcnt, res);
+  if (res >= 0 && fd >= 0) COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
+  return res;
+}
+#define INIT_PREADV2 COMMON_INTERCEPT_FUNCTION(preadv2)
+#else
+#define INIT_PREADV2
+#endif
+
+#if SANITIZER_INTERCEPT_PWRITEV2
+INTERCEPTOR(SSIZE_T, pwritev2, int fd, __sanitizer_iovec *iov, int iovcnt,
+            OFF_T offset, int flags) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, pwritev2, fd, iov, iovcnt, offset, flags);
+  COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
+  if (fd >= 0) COMMON_INTERCEPTOR_FD_RELEASE(ctx, fd);
+  SSIZE_T res = REAL(pwritev2)(fd, iov, iovcnt, offset, flags);
+  if (res > 0) read_iovec(ctx, iov, iovcnt, res);
+  return res;
+}
+#define INIT_PWRITEV2 COMMON_INTERCEPT_FUNCTION(pwritev2)
+#else
+#define INIT_PWRITEV2
+#endif
+
 #include "sanitizer_common_interceptors_netbsd_compat.inc"
 
 namespace __sanitizer {
@@ -10583,6 +10615,8 @@ static void InitializeCommonInterceptors() {
   INIT___XUNAME;
   INIT_ARGP_PARSE;
   INIT_CPUSET_GETAFFINITY;
+  INIT_PREADV2;
+  INIT_PWRITEV2;
 
   INIT___PRINTF_CHK;
 }

diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
index de55c736d0e14..7d7ed9bc07ccf 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -598,6 +598,9 @@
 #define SANITIZER_INTERCEPT_PROCCTL SI_FREEBSD
 #define SANITIZER_INTERCEPT_ARGP_PARSE SI_GLIBC
 #define SANITIZER_INTERCEPT_CPUSET_GETAFFINITY SI_FREEBSD
+// FIXME: also available from musl 1.2.5
+#define SANITIZER_INTERCEPT_PREADV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))
+#define SANITIZER_INTERCEPT_PWRITEV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))
 
 // This macro gives a way for downstream users to override the above
 // interceptor macros irrespective of the platform they are on. They have

diff  --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/preadv2.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/preadv2.cpp
new file mode 100644
index 0000000000000..4ec6f9f69078a
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/preadv2.cpp
@@ -0,0 +1,36 @@
+// RUN: %clangxx -O0 %s -o %t
+
+// REQUIRES: glibc
+
+#include <assert.h>
+#include <fcntl.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+#if !defined(__GLIBC_PREREQ)
+#define __GLIBC_PREREQ(a, b) 0
+#endif
+
+#if !__GLIBC_PREREQ(2, 26)
+#define preadv2(a, b, c, d, e) preadv(a, b, c, d) 
+#endif
+
+int main(void) {
+  int fd = open("/proc/self/stat", O_RDONLY);
+  char bufa[7];
+  char bufb[7];
+  struct iovec vec[2];
+  vec[0].iov_base = bufa + 4;
+  vec[0].iov_len = 1;
+  vec[1].iov_base = bufb;
+  vec[1].iov_len = sizeof(bufb);
+  ssize_t rd = preadv2(fd, vec, 2, 0, 0);
+  assert(rd > 0);
+  vec[0].iov_base = bufa;
+  rd = preadv2(fd, vec, 2, 0, 0);
+  assert(rd > 0);
+  rd = preadv2(fd, vec, 5, -25, 0);
+  assert(rd < 0);
+  close(fd);
+  return 0;
+}


        


More information about the llvm-commits mailing list