From 2d7c70eec7e2688e465c7bfba60c927fad0abfb1 Mon Sep 17 00:00:00 2001 From: Michal Bednarski Date: Sat, 13 May 2023 13:49:02 +0200 Subject: [PATCH] Minimal support for execveat(AT_FDCWD) termux/proot-distro#299 --- src/syscall/enter.c | 15 +++++++++++++++ src/syscall/seccomp.c | 1 + 2 files changed, 16 insertions(+) diff --git a/src/syscall/enter.c b/src/syscall/enter.c index 291bdce1..be71ded1 100644 --- a/src/syscall/enter.c +++ b/src/syscall/enter.c @@ -30,6 +30,7 @@ #include /* PR_SET_DUMPABLE */ #include /* TCSETS, TCSANOW */ +#include "cli/note.h" #include "syscall/syscall.h" #include "syscall/sysnum.h" #include "syscall/socket.h" @@ -127,6 +128,20 @@ int translate_syscall_enter(Tracee *tracee) status = translate_execve_enter(tracee); break; + case PR_execveat: + if ((int) peek_reg(tracee, CURRENT, SYSARG_1) == AT_FDCWD) { + set_sysnum(tracee, PR_execve); + poke_reg(tracee, SYSARG_1, peek_reg(tracee, CURRENT, SYSARG_2)); + poke_reg(tracee, SYSARG_2, peek_reg(tracee, CURRENT, SYSARG_3)); + poke_reg(tracee, SYSARG_3, peek_reg(tracee, CURRENT, SYSARG_4)); + } else { + note(tracee, ERROR, SYSTEM, "execveat() with non-AT_FDCWD fd is not currently supported"); + status = -ENOSYS; + break; + } + status = translate_execve_enter(tracee); + break; + case PR_ptrace: status = translate_ptrace_enter(tracee); break; diff --git a/src/syscall/seccomp.c b/src/syscall/seccomp.c index b85b43d6..c159467d 100644 --- a/src/syscall/seccomp.c +++ b/src/syscall/seccomp.c @@ -343,6 +343,7 @@ static FilteredSysnum proot_sysnums[] = { { PR_connect, 0 }, { PR_creat, 0 }, { PR_execve, FILTER_SYSEXIT }, + { PR_execveat, 0 }, { PR_faccessat, 0 }, { PR_faccessat2, 0 }, { PR_fchdir, FILTER_SYSEXIT },