Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Preprocessor checks for system with fewer syscalls #113

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/intercept.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 };
}
Expand Down
2 changes: 2 additions & 0 deletions src/intercept.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
11 changes: 10 additions & 1 deletion src/intercept_desc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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__);

Expand Down Expand Up @@ -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) {
Expand Down
5 changes: 5 additions & 0 deletions src/intercept_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down
94 changes: 94 additions & 0 deletions src/syscall_formats.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_),
Expand All @@ -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),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -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),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -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_),
Expand All @@ -276,15 +358,19 @@ 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_),
SARGS(openat, rdec, arg_atfd, arg_cstr, arg_open_flags),
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),
Expand All @@ -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_),
Expand Down Expand Up @@ -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}};
Expand Down Expand Up @@ -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;
Expand Down