mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-08 16:21:32 +00:00
77 lines
2.7 KiB
Diff
77 lines
2.7 KiB
Diff
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
|
|
index b13a170e..5678c006 100644
|
|
--- a/linux-user/syscall.c
|
|
+++ b/linux-user/syscall.c
|
|
@@ -111,6 +111,9 @@
|
|
|
|
#include "qemu.h"
|
|
#include "fd-trans.h"
|
|
+#include <linux/sockios.h>
|
|
+
|
|
+extern unsigned int afl_forksrv_pid;
|
|
|
|
#ifndef CLONE_IO
|
|
#define CLONE_IO 0x80000000 /* Clone io context */
|
|
@@ -250,7 +253,8 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
|
|
#endif
|
|
|
|
#ifdef __NR_gettid
|
|
-_syscall0(int, gettid)
|
|
+#define __NR_sys_gettid __NR_gettid
|
|
+_syscall0(int, sys_gettid)
|
|
#else
|
|
/* This is a replacement for the host gettid() and must return a host
|
|
errno. */
|
|
@@ -5384,7 +5388,7 @@ static void *clone_func(void *arg)
|
|
cpu = ENV_GET_CPU(env);
|
|
thread_cpu = cpu;
|
|
ts = (TaskState *)cpu->opaque;
|
|
- info->tid = gettid();
|
|
+ info->tid = sys_gettid();
|
|
task_settid(ts);
|
|
if (info->child_tidptr)
|
|
put_user_u32(info->tid, info->child_tidptr);
|
|
@@ -5529,9 +5533,9 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
|
mapping. We can't repeat the spinlock hack used above because
|
|
the child process gets its own copy of the lock. */
|
|
if (flags & CLONE_CHILD_SETTID)
|
|
- put_user_u32(gettid(), child_tidptr);
|
|
+ put_user_u32(sys_gettid(), child_tidptr);
|
|
if (flags & CLONE_PARENT_SETTID)
|
|
- put_user_u32(gettid(), parent_tidptr);
|
|
+ put_user_u32(sys_gettid(), parent_tidptr);
|
|
ts = (TaskState *)cpu->opaque;
|
|
if (flags & CLONE_SETTLS)
|
|
cpu_set_tls (env, newtls);
|
|
@@ -10529,7 +10533,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
|
return TARGET_PAGE_SIZE;
|
|
#endif
|
|
case TARGET_NR_gettid:
|
|
- return get_errno(gettid());
|
|
+ return get_errno(sys_gettid());
|
|
#ifdef TARGET_NR_readahead
|
|
case TARGET_NR_readahead:
|
|
#if TARGET_ABI_BITS == 32
|
|
@@ -10813,8 +10817,19 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
|
|
return get_errno(safe_tkill((int)arg1, target_to_host_signal(arg2)));
|
|
|
|
case TARGET_NR_tgkill:
|
|
- return get_errno(safe_tgkill((int)arg1, (int)arg2,
|
|
- target_to_host_signal(arg3)));
|
|
+ {
|
|
+ int pid = (int)arg1,
|
|
+ tgid = (int)arg2,
|
|
+ sig = (int)arg3;
|
|
+
|
|
+ /* Not entirely sure if the below is correct for all architectures. */
|
|
+
|
|
+ if(afl_forksrv_pid && afl_forksrv_pid == pid && sig == SIGABRT)
|
|
+ pid = tgid = getpid();
|
|
+
|
|
+ ret = get_errno(safe_tgkill(pid, tgid, target_to_host_signal(sig)));
|
|
+
|
|
+ }
|
|
|
|
#ifdef TARGET_NR_set_robust_list
|
|
case TARGET_NR_set_robust_list:
|