From e413682d27e5c2d44f345c683576837fa9c76a1f Mon Sep 17 00:00:00 2001 From: Michal Bednarski Date: Sun, 30 Dec 2018 18:22:14 +0100 Subject: [PATCH] Fix assertion "!IS_IN_SYSENTER(tracee)" on Huawei When syscall was cancelled by poke data workaround, don't relaunch it if it was cancelled by us (otherwise we'll relaunch it as cancel wasn't intended, but required to actually perform different operation (memory write)) termux/proot#49 --- src/syscall/syscall.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/syscall/syscall.c b/src/syscall/syscall.c index 0761a263..c3cd7815 100644 --- a/src/syscall/syscall.c +++ b/src/syscall/syscall.c @@ -164,12 +164,14 @@ void translate_syscall(Tracee *tracee) #ifdef HAS_POKEDATA_WORKAROUND if (tracee->pokedata_workaround_cancelled_syscall) { tracee->pokedata_workaround_cancelled_syscall = false; - tracee->pokedata_workaround_relaunched_syscall = true; - tracee->restart_how = PTRACE_SYSCALL; - tracee->status = 0; - poke_reg(tracee, INSTR_POINTER, peek_reg(tracee, CURRENT, INSTR_POINTER) - SYSTRAP_SIZE); - push_specific_regs(tracee, false); - return; + if (get_sysnum(tracee, CURRENT) != PR_void) { + tracee->pokedata_workaround_relaunched_syscall = true; + tracee->restart_how = PTRACE_SYSCALL; + tracee->status = 0; + poke_reg(tracee, INSTR_POINTER, peek_reg(tracee, CURRENT, INSTR_POINTER) - SYSTRAP_SIZE); + push_specific_regs(tracee, false); + return; + } } #endif