Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc
Show First 20 Lines • Show All 217 Lines • ▼ Show 20 Lines | static void kernel_stat_to_stat(struct kernel_stat *in, struct stat *out) { | ||||
out->st_mtime = in->st_mtime_nsec; | out->st_mtime = in->st_mtime_nsec; | ||||
out->st_ctime = in->st_ctime_nsec; | out->st_ctime = in->st_ctime_nsec; | ||||
out->st_ino = in->st_ino; | out->st_ino = in->st_ino; | ||||
} | } | ||||
#endif | #endif | ||||
uptr internal_stat(const char *path, void *buf) { | uptr internal_stat(const char *path, void *buf) { | ||||
#if SANITIZER_FREEBSD | #if SANITIZER_FREEBSD | ||||
return internal_syscall(SYSCALL(stat), path, buf); | return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, | ||||
(uptr)buf, 0); | |||||
#elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | #elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | ||||
return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, | return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, | ||||
(uptr)buf, 0); | (uptr)buf, 0); | ||||
#elif SANITIZER_LINUX_USES_64BIT_SYSCALLS | #elif SANITIZER_LINUX_USES_64BIT_SYSCALLS | ||||
# if defined(__mips64) | # if defined(__mips64) | ||||
// For mips64, stat syscall fills buffer in the format of kernel_stat | // For mips64, stat syscall fills buffer in the format of kernel_stat | ||||
struct kernel_stat kbuf; | struct kernel_stat kbuf; | ||||
int res = internal_syscall(SYSCALL(stat), path, &kbuf); | int res = internal_syscall(SYSCALL(stat), path, &kbuf); | ||||
kernel_stat_to_stat(&kbuf, (struct stat *)buf); | kernel_stat_to_stat(&kbuf, (struct stat *)buf); | ||||
return res; | return res; | ||||
# else | # else | ||||
return internal_syscall(SYSCALL(stat), (uptr)path, (uptr)buf); | return internal_syscall(SYSCALL(stat), (uptr)path, (uptr)buf); | ||||
# endif | # endif | ||||
#else | #else | ||||
struct stat64 buf64; | struct stat64 buf64; | ||||
int res = internal_syscall(SYSCALL(stat64), path, &buf64); | int res = internal_syscall(SYSCALL(stat64), path, &buf64); | ||||
stat64_to_stat(&buf64, (struct stat *)buf); | stat64_to_stat(&buf64, (struct stat *)buf); | ||||
return res; | return res; | ||||
#endif | #endif | ||||
} | } | ||||
uptr internal_lstat(const char *path, void *buf) { | uptr internal_lstat(const char *path, void *buf) { | ||||
#if SANITIZER_FREEBSD | #if SANITIZER_FREEBSD | ||||
return internal_syscall(SYSCALL(lstat), path, buf); | return internal_syscall(SYSCALL(fstatat), AT_FDCWD, (uptr)path, | ||||
(uptr)buf, AT_SYMLINK_NOFOLLOW); | |||||
#elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | #elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | ||||
return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, | return internal_syscall(SYSCALL(newfstatat), AT_FDCWD, (uptr)path, | ||||
(uptr)buf, AT_SYMLINK_NOFOLLOW); | (uptr)buf, AT_SYMLINK_NOFOLLOW); | ||||
#elif SANITIZER_LINUX_USES_64BIT_SYSCALLS | #elif SANITIZER_LINUX_USES_64BIT_SYSCALLS | ||||
# if SANITIZER_MIPS64 | # if SANITIZER_MIPS64 | ||||
// For mips64, lstat syscall fills buffer in the format of kernel_stat | // For mips64, lstat syscall fills buffer in the format of kernel_stat | ||||
struct kernel_stat kbuf; | struct kernel_stat kbuf; | ||||
int res = internal_syscall(SYSCALL(lstat), path, &kbuf); | int res = internal_syscall(SYSCALL(lstat), path, &kbuf); | ||||
▲ Show 20 Lines • Show All 326 Lines • ▼ Show 20 Lines | uptr internal_getpid() { | ||||
return internal_syscall(SYSCALL(getpid)); | return internal_syscall(SYSCALL(getpid)); | ||||
} | } | ||||
uptr internal_getppid() { | uptr internal_getppid() { | ||||
return internal_syscall(SYSCALL(getppid)); | return internal_syscall(SYSCALL(getppid)); | ||||
} | } | ||||
uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) { | uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) { | ||||
#if SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | #if SANITIZER_FREEBSD | ||||
return internal_syscall(SYSCALL(getdirentries), fd, (uptr)dirp, count, NULL); | |||||
#elif SANITIZER_USES_CANONICAL_LINUX_SYSCALLS | |||||
return internal_syscall(SYSCALL(getdents64), fd, (uptr)dirp, count); | return internal_syscall(SYSCALL(getdents64), fd, (uptr)dirp, count); | ||||
#else | #else | ||||
return internal_syscall(SYSCALL(getdents), fd, (uptr)dirp, count); | return internal_syscall(SYSCALL(getdents), fd, (uptr)dirp, count); | ||||
#endif | #endif | ||||
} | } | ||||
uptr internal_lseek(fd_t fd, OFF_T offset, int whence) { | uptr internal_lseek(fd_t fd, OFF_T offset, int whence) { | ||||
return internal_syscall(SYSCALL(lseek), fd, offset, whence); | return internal_syscall(SYSCALL(lseek), fd, offset, whence); | ||||
▲ Show 20 Lines • Show All 804 Lines • Show Last 20 Lines |