[compiler-rt] 9a54c77 - Reland copy file range san (#129114)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 27 12:58:55 PST 2025
Author: David CARLIER
Date: 2025-02-27T12:58:51-08:00
New Revision: 9a54c77aa361d0d1f98a39a89e3f543d15d182a5
URL: https://github.com/llvm/llvm-project/commit/9a54c77aa361d0d1f98a39a89e3f543d15d182a5
DIFF: https://github.com/llvm/llvm-project/commit/9a54c77aa361d0d1f98a39a89e3f543d15d182a5.diff
LOG: Reland copy file range san (#129114)
Added:
compiler-rt/test/sanitizer_common/TestCases/Linux/copy_file_range.c
Modified:
compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
Removed:
################################################################################
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
index 29fe4721ba40d..521fc116f2888 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
@@ -3205,6 +3205,28 @@ POST_SYSCALL(futex)
COMMON_SYSCALL_BLOCKING_END();
}
+PRE_SYSCALL(copy_file_range)
+(int fdin, __sanitizer___kernel_off_t *offin, int fdout,
+ __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
+ if (offin != nullptr) {
+ PRE_READ(offin, sizeof(*offin));
+ }
+ if (offout != nullptr) {
+ PRE_READ(offout, sizeof(*offout));
+ }
+}
+
+POST_SYSCALL(copy_file_range)
+(SSIZE_T, int fdin, __sanitizer___kernel_off_t *offin, int fdout,
+ __sanitizer___kernel_off_t *offout, SIZE_T size, unsigned int flags) {
+ if (offin != nullptr) {
+ POST_WRITE(offin, sizeof(*offin));
+ }
+ if (offout != nullptr) {
+ POST_WRITE(offout, sizeof(*offout));
+ }
+}
+
} // extern "C"
# undef PRE_SYSCALL
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/copy_file_range.c b/compiler-rt/test/sanitizer_common/TestCases/Linux/copy_file_range.c
new file mode 100644
index 0000000000000..c9e3817c697c0
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/copy_file_range.c
@@ -0,0 +1,42 @@
+// RUN: %clangxx -O0 %s -D_FILE_OFFSET_BITS=64 -o %t
+
+// REQUIRES: glibc
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+#endif
+#include <assert.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#if !defined(__GLIBC_PREREQ)
+# define __GLIBC_PREREQ(a, b) 0
+#endif
+
+#if !__GLIBC_PREREQ(2, 27)
+# define copy_file_range(a, b, c, d, e, f) \
+ (ssize_t) syscall(__NR_copy_file_range, a, b, c, d, e, f)
+#endif
+
+int main(void) {
+ int fdin = open("/proc/self/maps", O_RDONLY);
+ assert(fdin > 0);
+ char tmp[] = "/tmp/map.XXXXXX";
+ int fdout = mkstemp(tmp);
+ assert(fdout > 0);
+ off_t offin = -1, offout = 0;
+ ssize_t cpy = copy_file_range(fdin, &offin, fdout, &offout, 8, 0);
+ assert(cpy < 0);
+ offin = 0;
+ offout = 16;
+ cpy = copy_file_range(fdin, &offin, fdout, &offout, 8, 0);
+ assert(cpy < 0);
+ offout = 0;
+ cpy = copy_file_range(fdin, &offin, fdout, &offout, 8, 0);
+ assert(cpy == 8);
+ close(fdout);
+ close(fdin);
+ return 0;
+}
More information about the llvm-commits
mailing list