diff --git a/src/intercept.c b/src/intercept.c index 9600ad8d..a18970b8 100644 --- a/src/intercept.c +++ b/src/intercept.c @@ -412,7 +412,7 @@ analyze_object(struct dl_phdr_info *info, size_t size, void *data) const char *path; debug_dump("analyze_object called on \"%s\" at 0x%016" PRIxPTR "\n", - info->dlpi_name, info->dlpi_addr); + info->dlpi_name, (uintptr_t)info->dlpi_addr); if ((path = get_object_path(info)) == NULL) return 0; @@ -657,7 +657,11 @@ intercept_routine(struct context *context) desc.args[5], &result); +#ifdef SYS_vfork if (desc.nr == SYS_vfork || desc.nr == SYS_rt_sigreturn) { +#else + if (desc.nr == SYS_rt_sigreturn) { +#endif /* can't handle these syscalls the normal way */ return (struct wrapper_ret){.rax = context->rax, .rdx = 0 }; } diff --git a/src/intercept.h b/src/intercept.h index 2edfd296..86e1bcb0 100644 --- a/src/intercept.h +++ b/src/intercept.h @@ -217,7 +217,9 @@ void create_jump(unsigned char opcode, unsigned char *from, void *to); extern const char *cmdline; +#ifndef PAGE_SIZE #define PAGE_SIZE ((size_t)0x1000) +#endif static inline unsigned char * round_down_address(unsigned char *address) diff --git a/src/intercept_desc.c b/src/intercept_desc.c index 2d083ec0..a1da6136 100644 --- a/src/intercept_desc.c +++ b/src/intercept_desc.c @@ -62,7 +62,11 @@ open_orig_file(const struct intercept_desc *desc) { int fd; +#ifdef SYS_open fd = syscall_no_intercept(SYS_open, desc->path, O_RDONLY); +#else + fd = syscall_no_intercept(SYS_openat, AT_FDCWD, desc->path, O_RDONLY); +#endif xabort_on_syserror(fd, __func__); @@ -561,7 +565,12 @@ get_min_address(void) min_address = 0x10000; /* best guess */ - int fd = syscall_no_intercept(SYS_open, "/proc/sys/vm/mmap_min_addr", +#ifdef SYS_open + int fd = syscall_no_intercept(SYS_open, +#else + int fd = syscall_no_intercept(SYS_openat, AT_FDCWD, +#endif + "/proc/sys/vm/mmap_min_addr", O_RDONLY); if (fd >= 0) { diff --git a/src/intercept_log.c b/src/intercept_log.c index 03ec4d4d..b2fd8e4f 100644 --- a/src/intercept_log.c +++ b/src/intercept_log.c @@ -830,7 +830,12 @@ intercept_setup_log(const char *path, const char *trunc) intercept_log_close(); /* in case a log was already open */ +#ifdef SYS_open log_fd = (int)syscall_no_intercept(SYS_open, full_path, flags, 0700); +#else + log_fd = (int)syscall_no_intercept(SYS_openat, AT_FDCWD, full_path, + flags, 0700); +#endif xabort_on_syserror(log_fd, "opening log"); } diff --git a/src/syscall_formats.c b/src/syscall_formats.c index eba064e9..97a3fa18 100644 --- a/src/syscall_formats.c +++ b/src/syscall_formats.c @@ -43,12 +43,20 @@ static const struct syscall_format formats[] = { SARGS(read, rdec, arg_fd, arg_buf_out, arg_dec), SARGS(write, rdec, arg_fd, arg_buf_in, arg_dec), +#ifdef SYS_open SARGS(open, rdec, arg_cstr, arg_open_flags), +#endif SARGS(close, rdec, arg_fd), +#ifdef SYS_stat SARGS(stat, rdec, arg_cstr, arg_pointer), +#endif SARGS(fstat, rdec, arg_fd, arg_pointer), +#ifdef SYS_lstat SARGS(lstat, rdec, arg_cstr, arg_pointer), +#endif +#ifdef SYS_poll SARGS(poll, rdec, arg_pointer, arg_, arg_), +#endif SARGS(lseek, rdec, arg_fd, arg_dec, arg_seek_whence), SARGS(mmap, rpointer, arg_pointer, arg_, arg_, arg_, arg_fd, arg_), SARGS(mprotect, rdec, arg_pointer, arg_, arg_), @@ -62,9 +70,15 @@ static const struct syscall_format formats[] = { SARGS(pwrite64, rdec, arg_fd, arg_buf_in, arg_dec, arg_dec), SARGS(readv, rdec, arg_fd, arg_pointer, arg_dec), SARGS(writev, rdec, arg_fd, arg_pointer, arg_dec), +#ifdef SYS_access SARGS(access, rdec, arg_cstr, arg_access_mode), +#endif +#ifdef SYS_pipe SARGS(pipe, rdec, arg_2fds), +#endif +#ifdef SYS_select SARGS(select, rdec, arg_dec32, arg_pointer, arg_pointer, arg_pointer, arg_pointer), +#endif SARGS(sched_yield, rdec, arg_none), SARGS(mremap, rpointer, arg_pointer, arg_dec, arg_dec, arg_dec32, arg_), SARGS(msync, rdec, arg_pointer, arg_dec, arg_dec32), @@ -74,11 +88,17 @@ static const struct syscall_format formats[] = { SARGS(shmat, rhex, arg_, arg_, arg_), SARGS(shmctl, rdec, arg_, arg_, arg_), SARGS(dup, rdec, arg_fd), +#ifdef SYS_dup2 SARGS(dup2, rdec, arg_fd, arg_fd), +#endif +#ifdef SYS_pause SARGS(pause, rdec, arg_none), +#endif SARGS(nanosleep, rdec, arg_, arg_), SARGS(getitimer, rdec, arg_, arg_), +#ifdef SYS_alarm SARGS(alarm, rdec, arg_), +#endif SARGS(setitimer, rdec, arg_, arg_, arg_), SARGS(getpid, rdec, arg_none), SARGS(sendfile, rdec, arg_fd, arg_fd, arg_, arg_), @@ -98,8 +118,12 @@ static const struct syscall_format formats[] = { SARGS(setsockopt, rdec, arg_fd, arg_, arg_, arg_, arg_), SARGS(getsockopt, rdec, arg_fd, arg_, arg_, arg_, arg_), SARGS(clone, rdec, arg_clone_flags, arg_pointer, arg_pointer, arg_pointer, arg_), +#ifdef SYS_fork SARGS(fork, rdec, arg_none), +#endif +#ifdef SYS_vfork SARGS(vfork, rdec, arg_none), +#endif SARGS(execve, rdec, arg_, arg_, arg_), SARGS(exit, rnoreturn, arg_), SARGS(wait4, rdec, arg_dec, arg_, arg_, arg_), @@ -119,23 +143,47 @@ static const struct syscall_format formats[] = { SARGS(fdatasync, rdec, arg_fd), SARGS(truncate, rdec, arg_cstr, arg_), SARGS(ftruncate, rdec, arg_fd, arg_), +#ifdef SYS_getdents SARGS(getdents, rdec, arg_fd, arg_, arg_), +#endif SARGS(getcwd, rdec, arg_, arg_), SARGS(chdir, rdec, arg_cstr), SARGS(fchdir, rdec, arg_fd), +#ifdef SYS_rename SARGS(rename, rdec, arg_cstr, arg_cstr), +#endif +#ifdef SYS_mkdir SARGS(mkdir, rdec, arg_cstr, arg_oct_mode), +#endif +#ifdef SYS_rmdir SARGS(rmdir, rdec, arg_cstr), +#endif +#ifdef SYS_creat SARGS(creat, rdec, arg_cstr, arg_oct_mode), +#endif +#ifdef SYS_link SARGS(link, rdec, arg_cstr, arg_cstr), +#endif +#ifdef SYS_unlink SARGS(unlink, rdec, arg_cstr), +#endif +#ifdef SYS_symlink SARGS(symlink, rdec, arg_cstr, arg_cstr), +#endif +#ifdef SYS_readlink SARGS(readlink, rdec, arg_cstr, arg_buf_out, arg_dec), +#endif +#ifdef SYS_chmod SARGS(chmod, rdec, arg_cstr, arg_oct_mode), +#endif SARGS(fchmod, rdec, arg_fd, arg_oct_mode), +#ifdef SYS_chown SARGS(chown, rdec, arg_cstr, arg_, arg_), +#endif SARGS(fchown, rdec, arg_fd, arg_, arg_), +#ifdef SYS_lchown SARGS(lchown, rdec, arg_cstr, arg_, arg_), +#endif SARGS(umask, rmode, arg_oct_mode), SARGS(gettimeofday, rdec, arg_, arg_), SARGS(getrlimit, rdec, arg_, arg_), @@ -151,7 +199,9 @@ static const struct syscall_format formats[] = { SARGS(geteuid, rdec, arg_none), SARGS(getegid, rdec, arg_none), SARGS(setpgid, rdec, arg_none), +#ifdef SYS_getpgrp SARGS(getpgrp, rdec, arg_none), +#endif SARGS(setsid, rdec, arg_none), SARGS(setreuid, rdec, arg_, arg_), SARGS(setregid, rdec, arg_, arg_), @@ -172,14 +222,24 @@ static const struct syscall_format formats[] = { SARGS(rt_sigqueueinfo, rdec, arg_, arg_, arg_), SARGS(rt_sigsuspend, rdec, arg_, arg_), SARGS(sigaltstack, rdec, arg_, arg_), +#ifdef SYS_utime SARGS(utime, rdec, arg_cstr, arg_), +#endif +#ifdef SYS_mknod SARGS(mknod, rdec, arg_cstr, arg_, arg_), +#endif +#ifdef SYS_uselib SARGS(uselib, rdec, arg_cstr), +#endif SARGS(personality, rdec, arg_), +#ifdef SYS_ustat SARGS(ustat, rdec, arg_, arg_), +#endif SARGS(statfs, rdec, arg_cstr, arg_), SARGS(fstatfs, rdec, arg_fd, arg_), +#ifdef SYS_sysfs SARGS(sysfs, rdec, arg_, arg_, arg_), +#endif SARGS(getpriority, rdec, arg_, arg_), SARGS(setpriority, rdec, arg_, arg_, arg_), SARGS(sched_setparam, rdec, arg_, arg_), @@ -194,11 +254,17 @@ static const struct syscall_format formats[] = { SARGS(mlockall, rdec, arg_), SARGS(munlockall, rdec, arg_none), SARGS(vhangup, rdec, arg_none), +#ifdef SYS_modify_ldt SARGS(modify_ldt, rdec, arg_, arg_, arg_), +#endif SARGS(pivot_root, rdec, arg_cstr, arg_), +#ifdef SYS__sysctl SARGS(_sysctl, rdec, arg_), +#endif SARGS(prctl, rdec, arg_, arg_, arg_, arg_, arg_), +#ifdef SYS_arch_prctl SARGS(arch_prctl, rdec, arg_, arg_, arg_), +#endif SARGS(adjtimex, rdec, arg_), SARGS(setrlimit, rdec, arg_, arg_), SARGS(chroot, rdec, arg_cstr), @@ -212,8 +278,12 @@ static const struct syscall_format formats[] = { SARGS(reboot, rdec, arg_, arg_, arg_, arg_), SARGS(sethostname, rdec, arg_, arg_), SARGS(setdomainname, rdec, arg_, arg_), +#ifdef SYS_iopl SARGS(iopl, rdec, arg_), +#endif +#ifdef SYS_ioperm SARGS(ioperm, rdec, arg_, arg_, arg_), +#endif SARGS(gettid, rdec, arg_none), SARGS(readahead, rdec, arg_fd, arg_dec, arg_dec), SARGS(setxattr, rdec, arg_cstr, arg_cstr, arg_buf_in, arg_dec, arg_), @@ -229,19 +299,27 @@ static const struct syscall_format formats[] = { SARGS(lremovexattr, rdec, arg_cstr, arg_cstr), SARGS(fremovexattr, rdec, arg_fd, arg_cstr), SARGS(tkill, rdec, arg_, arg_), +#ifdef SYS_time SARGS(time, rdec, arg_), +#endif SARGS(futex, rdec, arg_, arg_, arg_, arg_, arg_, arg_), SARGS(sched_setaffinity, rdec, arg_, arg_, arg_), SARGS(sched_getaffinity, rdec, arg_, arg_, arg_), +#ifdef SYS_set_thread_area SARGS(set_thread_area, rdec, arg_), +#endif SARGS(io_setup, rdec, arg_, arg_), SARGS(io_destroy, rdec, arg_), SARGS(io_getevents, rdec, arg_, arg_, arg_, arg_, arg_), SARGS(io_submit, rdec, arg_, arg_, arg_), SARGS(io_cancel, rdec, arg_, arg_, arg_), +#ifdef SYS_get_thread_area SARGS(get_thread_area, rdec, arg_), +#endif SARGS(lookup_dcookie, rdec, arg_, arg_, arg_), +#ifdef SYS_epoll_create SARGS(epoll_create, rdec, arg_), +#endif SARGS(getdents64, rdec, arg_fd, arg_, arg_), SARGS(set_tid_address, rdec, arg_), SARGS(semtimedop, rdec, arg_, arg_, arg_, arg_), @@ -256,10 +334,14 @@ static const struct syscall_format formats[] = { SARGS(clock_getres, rdec, arg_, arg_), SARGS(clock_nanosleep, rdec, arg_, arg_, arg_, arg_), SARGS(exit_group, rnoreturn, arg_), +#ifdef SYS_epoll_wait SARGS(epoll_wait, rdec, arg_fd, arg_, arg_, arg_), +#endif SARGS(epoll_ctl, rdec, arg_fd, arg_, arg_fd, arg_), SARGS(tgkill, rdec, arg_, arg_, arg_), +#ifdef SYS_utimes SARGS(utimes, rdec, arg_cstr, arg_), +#endif SARGS(mbind, rdec, arg_, arg_, arg_, arg_, arg_), SARGS(set_mempolicy, rdec, arg_, arg_, arg_), SARGS(get_mempolicy, rdec, arg_, arg_, arg_, arg_, arg_), @@ -276,7 +358,9 @@ static const struct syscall_format formats[] = { SARGS(keyctl, rdec, arg_, arg_, arg_, arg_, arg_), SARGS(ioprio_set, rdec, arg_, arg_, arg_), SARGS(ioprio_get, rdec, arg_, arg_), +#ifdef SYS_inotify_init SARGS(inotify_init, rdec, arg_none), +#endif SARGS(inotify_add_watch, rdec, arg_fd, arg_cstr, arg_), SARGS(inotify_rm_watch, rdec, arg_fd, arg_), SARGS(migrate_pages, rdec, arg_, arg_, arg_, arg_), @@ -284,7 +368,9 @@ static const struct syscall_format formats[] = { SARGS(mkdirat, rdec, arg_atfd, arg_cstr, arg_oct_mode), SARGS(mknodat, rdec, arg_atfd, arg_cstr, arg_oct_mode, arg_), SARGS(fchownat, rdec, arg_atfd, arg_cstr, arg_, arg_, arg_), +#ifdef SYS_futimesat SARGS(futimesat, rdec, arg_atfd, arg_cstr, arg_), +#endif SARGS(newfstatat, rdec, arg_atfd, arg_cstr, arg_, arg_), SARGS(unlinkat, rdec, arg_atfd, arg_cstr, arg_), SARGS(renameat, rdec, arg_atfd, arg_cstr, arg_atfd, arg_cstr), @@ -305,9 +391,13 @@ static const struct syscall_format formats[] = { SARGS(move_pages, rdec, arg_, arg_, arg_, arg_, arg_, arg_), SARGS(utimensat, rdec, arg_atfd, arg_cstr, arg_, arg_), SARGS(epoll_pwait, rdec, arg_fd, arg_, arg_, arg_, arg_, arg_), +#ifdef SYS_signalfd SARGS(signalfd, rdec, arg_fd, arg_, arg_), +#endif SARGS(timerfd_create, rdec, arg_, arg_), +#ifdef SYS_eventfd SARGS(eventfd, rdec, arg_), +#endif SARGS(fallocate, rdec, arg_fd, arg_, arg_, arg_), SARGS(timerfd_settime, rdec, arg_fd, arg_, arg_, arg_), SARGS(timerfd_gettime, rdec, arg_fd, arg_), @@ -396,8 +486,10 @@ static const struct syscall_format formats[] = { #undef SARGS +#ifdef SYS_open static struct syscall_format open_with_o_creat = {.name = "open", rdec, {arg_cstr, arg_open_flags, arg_oct_mode}}; +#endif static struct syscall_format openat_with_o_creat = {.name = "openat", rdec, {arg_atfd, arg_cstr, arg_open_flags, arg_oct_mode}}; @@ -450,8 +542,10 @@ get_syscall_format(const struct syscall_desc *desc) if (formats[desc->nr].name == NULL) return &unkown; +#ifdef SYS_open if (desc->nr == SYS_open && oflags_refer_mode_arg((int)desc->args[1])) return &open_with_o_creat; +#endif if (desc->nr == SYS_openat && oflags_refer_mode_arg((int)desc->args[2])) return &openat_with_o_creat;