diff --git a/unidbg-android/src/main/java/com/github/unidbg/linux/ARM32SyscallHandler.java b/unidbg-android/src/main/java/com/github/unidbg/linux/ARM32SyscallHandler.java index 416edd88f..74e88f6dc 100644 --- a/unidbg-android/src/main/java/com/github/unidbg/linux/ARM32SyscallHandler.java +++ b/unidbg-android/src/main/java/com/github/unidbg/linux/ARM32SyscallHandler.java @@ -97,6 +97,7 @@ public void hook(Backend backend, int intno, int swi, Object user) { } int NR = backend.reg_read(ArmConst.UC_ARM_REG_R7).intValue(); + //System.out.println("发生系统低哦啊用:"+NR); String syscall = null; Throwable exception = null; try { @@ -175,7 +176,7 @@ public void hook(Backend backend, int intno, int swi, Object user) { case 26: backend.reg_write(ArmConst.UC_ARM_REG_R0, ptrace(emulator)); return; - case 20: // getpid + case 20: // getpid backend.reg_write(ArmConst.UC_ARM_REG_R0, emulator.getPid()); return; case 224: // gettid @@ -330,6 +331,9 @@ public void hook(Backend backend, int intno, int swi, Object user) { case 177: backend.reg_write(ArmConst.UC_ARM_REG_R0, rt_sigtimedwait(emulator)); return; + case 178: + backend.reg_write(ArmConst.UC_ARM_REG_R0, rt_sigqueue(emulator)); + return; case 180: backend.reg_write(ArmConst.UC_ARM_REG_R0, pread64(emulator)); return; @@ -531,6 +535,7 @@ public void hook(Backend backend, int intno, int swi, Object user) { } } + private int mlock(Emulator emulator) { RegisterContext context = emulator.getContext(); Pointer addr = context.getPointerArg(0); @@ -976,7 +981,7 @@ private int llseek(Backend backend, Emulator emulator) { int fd = backend.reg_read(ArmConst.UC_ARM_REG_R0).intValue(); long offset_high = backend.reg_read(ArmConst.UC_ARM_REG_R1).intValue() & 0xffffffffL; long offset_low = backend.reg_read(ArmConst.UC_ARM_REG_R2).intValue() & 0xffffffffL; - long offset = (offset_high<<32) | offset_low; + long offset = (offset_high << 32) | offset_low; Pointer result = UnidbgPointer.register(emulator, ArmConst.UC_ARM_REG_R3); int whence = backend.reg_read(ArmConst.UC_ARM_REG_R4).intValue(); if (log.isDebugEnabled()) { @@ -1240,7 +1245,7 @@ private int poll(Backend backend, Emulator emulator) { pollfd.setShort(6, (short) 0); } else { short revents = 0; - if((events & POLLOUT) != 0) { + if ((events & POLLOUT) != 0) { revents = POLLOUT; } else if ((events & POLLIN) != 0) { revents = POLLIN; @@ -1685,7 +1690,7 @@ private int munmap(Backend backend, Emulator emulator) { private static final int PR_SET_DUMPABLE = 4; private static final int PR_SET_NAME = 15; private static final int PR_GET_NAME = 16; - private static final int BIONIC_PR_SET_VMA = 0x53564d41; + private static final int BIONIC_PR_SET_VMA = 0x53564d41; private static final int PR_SET_PTRACER = 0x59616d61; private int prctl(Backend backend, Emulator emulator) { diff --git a/unidbg-android/src/main/java/com/github/unidbg/linux/ARM64SyscallHandler.java b/unidbg-android/src/main/java/com/github/unidbg/linux/ARM64SyscallHandler.java index a4337ae02..1fa266c59 100644 --- a/unidbg-android/src/main/java/com/github/unidbg/linux/ARM64SyscallHandler.java +++ b/unidbg-android/src/main/java/com/github/unidbg/linux/ARM64SyscallHandler.java @@ -143,10 +143,10 @@ public void hook(Backend backend, int intno, int swi, Object user) { case 62: backend.reg_write(Arm64Const.UC_ARM64_REG_X0, lseek(emulator)); return; - case 172: // getpid + case 172: // getpid backend.reg_write(Arm64Const.UC_ARM64_REG_X0, emulator.getPid()); return; - case 178: // gettid + case 178: // gettid Task task = emulator.get(Task.TASK_KEY); backend.reg_write(Arm64Const.UC_ARM64_REG_X0, task == null ? 0 : task.getId()); return; @@ -249,6 +249,9 @@ public void hook(Backend backend, int intno, int swi, Object user) { case 137: backend.reg_write(Arm64Const.UC_ARM64_REG_X0, rt_sigtimedwait(emulator)); return; + case 138: + backend.reg_write(Arm64Const.UC_ARM64_REG_X0, rt_sigqueue(emulator)); + return; case 167: backend.reg_write(Arm64Const.UC_ARM64_REG_X0, prctl(emulator)); return; @@ -685,7 +688,7 @@ private int ppoll(Emulator emulator) { pollfd.setShort(6, (short) 0); } else { short revents = 0; - if((events & POLLOUT) != 0) { + if ((events & POLLOUT) != 0) { revents = POLLOUT; } else if ((events & POLLIN) != 0) { revents = POLLIN; @@ -1074,7 +1077,7 @@ private long mremap(Emulator emulator) { private static final int PR_SET_NAME = 15; private static final int PR_SET_NO_NEW_PRIVS = 38; - private static final int BIONIC_PR_SET_VMA = 0x53564d41; + private static final int BIONIC_PR_SET_VMA = 0x53564d41; private static final int PR_SET_PTRACER = 0x59616d61; private int prctl(Emulator emulator) { diff --git a/unidbg-android/src/main/java/com/github/unidbg/linux/AndroidSyscallHandler.java b/unidbg-android/src/main/java/com/github/unidbg/linux/AndroidSyscallHandler.java index f66583c6c..3ecc892fa 100644 --- a/unidbg-android/src/main/java/com/github/unidbg/linux/AndroidSyscallHandler.java +++ b/unidbg-android/src/main/java/com/github/unidbg/linux/AndroidSyscallHandler.java @@ -247,6 +247,7 @@ protected int rt_sigpending(Emulator emulator) { return 0; } + private static final int FUTEX_CMD_MASK = 0x7f; private static final int FUTEX_PRIVATE_FLAG = 0x80; private static final int MUTEX_SHARED_MASK = 0x2000; @@ -359,6 +360,34 @@ protected int rt_sigtimedwait(Emulator emulator) { return 0; } + protected int rt_sigqueue(Emulator emulator) { + RegisterContext context = emulator.getContext(); + int tgid = context.getIntArg(0); + int sig = context.getIntArg(1); + UnidbgPointer info = context.getPointerArg(2); + if (log.isDebugEnabled()) { + log.debug("rt_sigqueue tgid=" + tgid + ", sig=" + sig); + } + Task task = emulator.get(Task.TASK_KEY); + // 检查pid是有匹配进程存在 + if (!(tgid == 0 || tgid == -1 || Math.abs(tgid) == emulator.getPid())) { + return -UnixEmulator.ESRCH; + } + // 检查进程是否存在, 无需发送信号 + if (sig == 0) { + return 0; + } + if (sig < 0 || sig > 64) { + return -UnixEmulator.EINVAL; + } + if (task != null) { + SigAction sigAction = sigActionMap.get(sig); + //sigAction.sig_info = info; + return processSignal(emulator.getThreadDispatcher(), sig, task, sigAction, info); + } + throw new UnsupportedOperationException(); + } + @Override protected FileResult createFdDir(int oflags, String pathname) { List list = new ArrayList<>(); @@ -486,7 +515,7 @@ final int select(int nfds, Pointer checkfds, Pointer clearfds, boolean checkRead int count = 0; for (int i = 0; i < nfds; i++) { int mask = checkfds.getInt(i / 32); - if(((mask >> i) & 1) == 1) { + if (((mask >> i) & 1) == 1) { AndroidFileIO io = fdMap.get(i); if (!checkRead || io.canRead()) { count++; @@ -576,11 +605,13 @@ public MainTask createSignalHandlerTask(Emulator emulator, int sig) { @Override protected int sigaction(Emulator emulator, int signum, Pointer act, Pointer oldact) { + //TODO action参数解包 (64位有BUG, 暂定) SigAction action = SigAction.create(emulator, act); SigAction oldAction = SigAction.create(emulator, oldact); if (log.isDebugEnabled()) { log.debug("sigaction signum=" + signum + ", action=" + action + ", oldAction=" + oldAction); } + // SIGKILL 和 SIGSTOP 不允许自定义处理 if (SIGKILL == signum || SIGSTOP == signum) { if (oldAction != null) { oldAction.sa_handler = UnidbgPointer.pointer(emulator, SIG_ERR); @@ -611,20 +642,32 @@ protected int kill(Emulator emulator) { log.debug("kill pid=" + pid + ", sig=" + sig); } Task task = emulator.get(Task.TASK_KEY); - if (pid == 0 && sig > 0 && task != null) { + // 检查pid是有匹配进程存在 + if (!(pid == 0 || pid == -1 || Math.abs(pid) == emulator.getPid())) { + emulator.getMemory().setErrno(UnixEmulator.ESRCH); + return UnixEmulator.ESRCH; + } + // 检查进程是否存在, 无需发送信号 + if (sig == 0) { + return 0; + } + if (sig < 0 || sig > 64) { + return -UnixEmulator.EINVAL; + } + if (/*pid == 0 && */ task != null) { SigAction action = sigActionMap.get(sig); - return processSignal(emulator.getThreadDispatcher(), sig, task, action); + return processSignal(emulator.getThreadDispatcher(), sig, task, action, null); } throw new UnsupportedOperationException("kill pid=" + pid + ", sig=" + sig + ", LR=" + context.getLRPointer()); } - private int processSignal(ThreadDispatcher threadDispatcher, int sig, Task task, SigAction action) { + private int processSignal(ThreadDispatcher threadDispatcher, int sig, Task task, SigAction action, Pointer sig_info) { if (action != null) { SignalOps signalOps = task.isMainThread() ? threadDispatcher : task; SigSet sigMaskSet = signalOps.getSigMaskSet(); SigSet sigPendingSet = signalOps.getSigPendingSet(); if (sigMaskSet == null || !sigMaskSet.containsSigNumber(sig)) { - task.addSignalTask(new SignalTask(sig, action)); + task.addSignalTask(new SignalTask(sig, action, sig_info)); throw new ThreadContextSwitchException().setReturnValue(0); } else if (sigPendingSet != null) { sigPendingSet.addSigNumber(sig); @@ -648,6 +691,9 @@ protected int tgkill(Emulator emulator) { throw new ThreadContextSwitchException().setReturnValue(0); } } + if (sig < 0 || sig > 64) { + return -UnixEmulator.EINVAL; + } return 0; } diff --git a/unidbg-android/src/main/java/com/github/unidbg/linux/signal/SignalTask.java b/unidbg-android/src/main/java/com/github/unidbg/linux/signal/SignalTask.java index 1f575a9ef..0279a730e 100644 --- a/unidbg-android/src/main/java/com/github/unidbg/linux/signal/SignalTask.java +++ b/unidbg-android/src/main/java/com/github/unidbg/linux/signal/SignalTask.java @@ -9,16 +9,23 @@ import com.github.unidbg.signal.SigSet; import com.github.unidbg.signal.SignalOps; import com.github.unidbg.signal.UnixSigSet; +import com.sun.jna.Pointer; import unicorn.Arm64Const; import unicorn.ArmConst; public class SignalTask extends AbstractSignalTask { private final SigAction action; + private Pointer sig_info; public SignalTask(int signum, SigAction action) { + this(signum, action, null); + } + + public SignalTask(int signum, SigAction action, Pointer sig_info) { super(signum); this.action = action; + this.sig_info = sig_info; } private UnidbgPointer stack; @@ -48,24 +55,30 @@ private Number runHandler(AbstractEmulator emulator) { if (stack == null) { stack = allocateStack(emulator); } - if (action.needSigInfo() && infoBlock == null) { + if (action.needSigInfo() && infoBlock == null && sig_info == null) { infoBlock = emulator.getMemory().malloc(128, true); infoBlock.getPointer().setInt(0, signum); + sig_info = infoBlock.getPointer(); } if (emulator.is32Bit()) { backend.reg_write(ArmConst.UC_ARM_REG_SP, stack.peer); backend.reg_write(ArmConst.UC_ARM_REG_R0, signum); - backend.reg_write(ArmConst.UC_ARM_REG_R1, infoBlock == null ? 0 : infoBlock.getPointer().peer); // siginfo_t *info + backend.reg_write(ArmConst.UC_ARM_REG_R1, sig_info == null ? 0 : ((UnidbgPointer) sig_info).toIntPeer() /*infoBlock == null ? 0 : infoBlock.getPointer().peer*/); // siginfo_t *info backend.reg_write(ArmConst.UC_ARM_REG_R2, 0); // void *ucontext backend.reg_write(ArmConst.UC_ARM_REG_LR, emulator.getReturnAddress()); } else { backend.reg_write(Arm64Const.UC_ARM64_REG_SP, stack.peer); backend.reg_write(Arm64Const.UC_ARM64_REG_X0, signum); - backend.reg_write(Arm64Const.UC_ARM64_REG_X1, infoBlock == null ? 0 : infoBlock.getPointer().peer); // siginfo_t *info + backend.reg_write(Arm64Const.UC_ARM64_REG_X1, sig_info == null ? 0 : ((UnidbgPointer) sig_info).toUIntPeer()); // siginfo_t *info backend.reg_write(Arm64Const.UC_ARM64_REG_X2, 0); // void *ucontext backend.reg_write(Arm64Const.UC_ARM64_REG_LR, emulator.getReturnAddress()); } - return emulator.emulate(UnidbgPointer.nativeValue(action.sa_handler), emulator.getReturnAddress()); + long handler = UnidbgPointer.nativeValue(action.sa_handler); + // 如果handler忽略或缺省,直接返回 + if (handler == 1 || handler == 0) { + return -1; + } + return emulator.emulate(handler, emulator.getReturnAddress()); } @Override diff --git a/unidbg-android/src/test/java/com/github/unidbg/android/Signal64BxlTest.java b/unidbg-android/src/test/java/com/github/unidbg/android/Signal64BxlTest.java new file mode 100644 index 000000000..dcb4bedcb --- /dev/null +++ b/unidbg-android/src/test/java/com/github/unidbg/android/Signal64BxlTest.java @@ -0,0 +1,57 @@ +package com.github.unidbg.android; + +import com.alibaba.fastjson.util.IOUtils; +import com.github.unidbg.AndroidEmulator; +import com.github.unidbg.Module; +import com.github.unidbg.linux.android.AndroidEmulatorBuilder; +import com.github.unidbg.linux.android.AndroidResolver; +import com.github.unidbg.memory.Memory; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +import java.io.File; +import java.io.IOException; + +public class Signal64BxlTest { + + public static void main(String[] args) { + //Logger.getLogger(ARM32SyscallHandler.class).setLevel(Level.DEBUG); + Signal64BxlTest test = new Signal64BxlTest(); + test.test(); + test.destroy(); + } + + private void destroy() { + IOUtils.close(emulator); + } + + private final AndroidEmulator emulator; + private final Module module; + + private Signal64BxlTest() { + final File executable = new File("unidbg-android/src/test/native/bxl/example/arm64-v8a/build/ninja/signal64"); + emulator = AndroidEmulatorBuilder + .for64Bit() +// .addBackendFactory(new DynarmicFactory(true)) +// .addBackendFactory(new Unicorn2Factory(true)) + .build(); + Memory memory = emulator.getMemory(); + emulator.getSyscallHandler().setVerbose(false); + emulator.getSyscallHandler().setEnableThreadDispatcher(true); + AndroidResolver resolver = new AndroidResolver(23); + memory.setLibraryResolver(resolver); + + module = emulator.loadLibrary(executable, true); + } + + private void test() { + + Logger.getLogger("com.github.unidbg.linux.AndroidSyscallHandler").setLevel(Level.DEBUG); + emulator.emulateSignal(2); + emulator.emulateSignal(5); + int code = module.callEntry(emulator); + + System.err.println("exit code: " + code + ", backend=" + emulator.getBackend()); + } + +} diff --git a/unidbg-android/src/test/java/com/github/unidbg/android/SignalBxlTest.java b/unidbg-android/src/test/java/com/github/unidbg/android/SignalBxlTest.java new file mode 100644 index 000000000..c04c6ff90 --- /dev/null +++ b/unidbg-android/src/test/java/com/github/unidbg/android/SignalBxlTest.java @@ -0,0 +1,62 @@ +package com.github.unidbg.android; + +import com.alibaba.fastjson.util.IOUtils; +import com.github.unidbg.AbstractEmulator; +import com.github.unidbg.AndroidEmulator; +import com.github.unidbg.Module; +import com.github.unidbg.arm.backend.DynarmicFactory; +import com.github.unidbg.arm.backend.Unicorn2Factory; +import com.github.unidbg.linux.ARM32SyscallHandler; +import com.github.unidbg.linux.android.AndroidEmulatorBuilder; +import com.github.unidbg.linux.android.AndroidResolver; +import com.github.unidbg.memory.Memory; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + + +import java.io.File; +import java.io.IOException; + +public class SignalBxlTest { + + public static void main(String[] args) { + //Logger.getLogger(ARM32SyscallHandler.class).setLevel(Level.DEBUG); + SignalBxlTest test = new SignalBxlTest(); + test.test(); + test.destroy(); + } + + private void destroy() { + IOUtils.close(emulator); + } + + private final AndroidEmulator emulator; + private final Module module; + + private SignalBxlTest() { + final File executable = new File("unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/ninja/signal"); + emulator = AndroidEmulatorBuilder + .for32Bit() +// .addBackendFactory(new DynarmicFactory(true)) +// .addBackendFactory(new Unicorn2Factory(true)) + .build(); + Memory memory = emulator.getMemory(); + emulator.getSyscallHandler().setVerbose(false); + emulator.getSyscallHandler().setEnableThreadDispatcher(true); + AndroidResolver resolver = new AndroidResolver(23); + memory.setLibraryResolver(resolver); + + module = emulator.loadLibrary(executable, true); + } + + private void test() { + //emulator.traceCode(module.base, module.base+module.size); + Logger.getLogger("com.github.unidbg.linux.AndroidSyscallHandler").setLevel(Level.DEBUG); + emulator.emulateSignal(2); + emulator.emulateSignal(5); + int code = module.callEntry(emulator); + + System.err.println("exit code: " + code + ", backend=" + emulator.getBackend()); + } + +} diff --git a/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/ninja/signal64 b/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/ninja/signal64 new file mode 100755 index 000000000..963503fe5 Binary files /dev/null and b/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/ninja/signal64 differ diff --git a/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/signal.c b/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/signal.c new file mode 100644 index 000000000..17ac100a7 --- /dev/null +++ b/unidbg-android/src/test/native/bxl/example/arm64-v8a/build/signal.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +void sig_handle(int sig){ + printf("recv a signal: %d\n", sig); +} + +void sig_handle2(int sig, siginfo_t *info, void *data){ + printf("recv a signal: %d with data: %s\n", sig, (char *)info->si_value.sival_ptr); +} + +__attribute__((constructor)) +static void init() { + // 普通signal设置信号 + + //signal(2, sig_handle); + //signal(4, sig_handle); + + // 高级版sigaction + struct sigaction act; + memset(&act, 0, sizeof(act)); + sigemptyset(&act.sa_mask); + sigaddset(&act.sa_mask, 2); + act.sa_handler = sig_handle; + sigaction(2, &act, NULL); + + // 屏蔽4信号 + sigset_t set; + sigemptyset(&set); + sigaddset(&set, 4); + sigprocmask(SIG_BLOCK, &set, NULL); + + // sigaction携带数据 + struct sigaction act2; + memset(&act2, 0, sizeof(act2)); + sigemptyset(&act2.sa_mask); + sigaddset(&act2.sa_mask, 4); + + //act2.sa_handler = sig_handle; + act2.sa_sigaction = sig_handle2; + act2.sa_flags = SA_SIGINFO; + sigaction(5, &act2, NULL); + + + + printf("init finished!\n\n"); +} + +int main(){ + pid_t pid = getpid(); + printf("my pid is %d\n", pid); + int err; + + err = kill(999, 2); + printf("kill 999 2 ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + err = kill(0, 2); + printf("kill 0 2 ret %d\n\n", err); + + err = kill(0, 0); + printf("kill 0 0 ret %d\n\n", err); + + err = kill(-1, 2); + printf("kill -1 2 ret %d\n\n", err); + + err = raise(2); + printf("raise(2) ret %d\n\n", err); + + err = kill(0, 65); + printf("kill 0 65 ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + err = raise(65); + printf("raise(65) ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + + kill(0, 4); + + union sigval val; + val.sival_ptr = "hello!"; + sigqueue(pid, 5, val); + return 0; +} \ No newline at end of file diff --git a/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/ninja/signal b/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/ninja/signal new file mode 100755 index 000000000..1fb8727f6 Binary files /dev/null and b/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/ninja/signal differ diff --git a/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/signal.c b/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/signal.c new file mode 100644 index 000000000..84e662f7b --- /dev/null +++ b/unidbg-android/src/test/native/bxl/example/armeabi-v7a/build/signal.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +void sig_handle(int sig){ + printf("recv a signal: %d\n", sig); +} + +void sig_handle2(int sig, siginfo_t *info, void *data){ + printf("recv a signal: %d with data: %s\n", sig, (char *)info->si_value.sival_ptr); +} + +__attribute__((constructor)) +static void init() { + // 普通signal设置信号 + + signal(2, sig_handle); + //signal(4, sig_handle); + + // 高级版sigaction + struct sigaction act; + memset(&act, 0, sizeof(act)); + sigemptyset(&act.sa_mask); + sigaddset(&act.sa_mask, 4); + act.sa_handler = sig_handle; + sigaction(4, &act, NULL); + + // 屏蔽4信号 + sigset_t set; + sigemptyset(&set); + sigaddset(&set, 4); + sigprocmask(SIG_BLOCK, &set, NULL); + + // sigaction携带数据 + struct sigaction act2; + memset(&act2, 0, sizeof(act2)); + sigemptyset(&act2.sa_mask); + sigaddset(&act2.sa_mask, 4); + + //act2.sa_handler = sig_handle; + act2.sa_sigaction = sig_handle2; + act2.sa_flags = SA_SIGINFO; + sigaction(5, &act2, NULL); + + + + printf("init finished!\n\n"); +} + +int main(){ + pid_t pid = getpid(); + printf("my pid is %d\n", pid); + int err; + + err = kill(999, 2); + printf("kill 999 2 ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + err = kill(0, 2); + printf("kill 0 2 ret %d\n\n", err); + + err = kill(-1, 2); + printf("kill -1 2 ret %d\n\n", err); + + err = kill(0, 0); + printf("kill 0 0 ret %d\n\n", err); + + err = raise(2); + printf("raise(2) ret %d\n\n", err); + + err = kill(0, 65); + printf("kill 0 65 ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + err = raise(65); + printf("raise(65) ret %d\n", err); + printf("error:%s\n\n", strerror(errno)); + + + kill(0, 4); + + union sigval val; + val.sival_ptr = "hello!"; + sigqueue(pid, 5, val); + return 0; +} \ No newline at end of file diff --git a/unidbg-api/src/main/java/com/github/unidbg/unix/UnixEmulator.java b/unidbg-api/src/main/java/com/github/unidbg/unix/UnixEmulator.java index e250caf72..b6a2eaf3d 100644 --- a/unidbg-api/src/main/java/com/github/unidbg/unix/UnixEmulator.java +++ b/unidbg-api/src/main/java/com/github/unidbg/unix/UnixEmulator.java @@ -4,6 +4,7 @@ public interface UnixEmulator { int EPERM = 1; /* Operation not permitted */ int ENOENT = 2; /* No such file or directory */ + int ESRCH = 3; /* No such process */ int EINTR = 4; /* Interrupted system call */ int EBADF = 9; /* Bad file descriptor */ int EAGAIN = 11; /* Resource temporarily unavailable */