1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-25 07:28:20 +00:00

Update Android port

* exec/config.h.in: Autoheader.
* exec/configure.ac: Check for siginfo_t.si_syscall.
* exec/trace.c (exec_waitpid): If SIGSYS is received, and caused by
seccomp, drop it should the call number be the invalid system call
used by Emacs.
This commit is contained in:
Po Lu 2023-05-03 17:01:44 +08:00
parent 7b3c774bce
commit b0d6c67372
3 changed files with 32 additions and 0 deletions

View File

@ -58,6 +58,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
/* Define to 1 if process_vm_readv is available. */
#undef HAVE_PROCESS_VM
/* Define to 1 if `si_syscall' is a member of `siginfo_t'. */
#undef HAVE_SIGINFO_T_SI_SYSCALL
/* Define to 1 if stdbool.h conforms to C99. */
#undef HAVE_STDBOOL_H

View File

@ -73,6 +73,10 @@ AC_CHECK_FUNC([process_vm_readv],
#include <sys/uio.h>
]])])])
AC_CHECK_HEADERS([sys/param.h sys/uio.h])
AC_CHECK_MEMBERS([siginfo_t.si_syscall], [], [],
[[
#include <signal.h>
]])
AH_BOTTOM([
#ifdef HAVE_STDBOOL_H

View File

@ -1174,6 +1174,31 @@ exec_waitpid (pid_t pid, int *wstatus, int options)
ptrace (PTRACE_SYSCALL, pid, 0, 0);
return -1;
#ifdef SIGSYS
case SIGSYS:
if (ptrace (PTRACE_GETSIGINFO, pid, 0, &siginfo))
return -1;
/* Continue the process until the next syscall, but don't
pass through the signal if an emulated syscall led to
it. */
#ifdef HAVE_SIGINFO_T_SI_SYSCALL
#ifndef __arm__
ptrace (PTRACE_SYSCALL, pid, 0, ((siginfo.si_code == SYS_SECCOMP
&& siginfo.si_syscall == -1)
? 0 : status));
#else /* __arm__ */
ptrace (PTRACE_SYSCALL, pid, 0, ((siginfo.si_code == SYS_SECCOMP
&& siginfo.si_syscall == 222)
? 0 : status));
#endif /* !__arm__ */
#else /* !HAVE_SIGINFO_T_SI_SYSCALL */
/* Drop this signal, since what caused it is unknown. */
ptrace (PTRACE_SYSCALL, pid, 0, 0);
#endif /* HAVE_SIGINFO_T_SI_SYSCALL */
return -1;
#endif /* SIGSYS */
default:
/* Continue the process until the next syscall. */
ptrace (PTRACE_SYSCALL, pid, 0, status);