]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Wed, 3 May 2023 09:01:44 +0000 (17:01 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 3 May 2023 09:01:44 +0000 (17:01 +0800)
* 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.

exec/config.h.in
exec/configure.ac
exec/trace.c

index 6301275fd8a300784d7565dd44209a53f5d1d660..3e04af37f796670d35f4bd38e9cb88ff841a2780 100644 (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
 
index efefc6c7dbc9ec9eaa5a6facf5c0fac0f68e0b1b..e78d8ebea90c1e4cf37dee99f18cec810714fb2d 100644 (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
index 8d1076964231b40cf4de2a787d87604cca1b15b0..579a62f6c5e5e29424af90023ff5b4e14bc6935a 100644 (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);