]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Fri, 5 May 2023 04:10:14 +0000 (12:10 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 5 May 2023 04:10:14 +0000 (12:10 +0800)
* doc/emacs/android.texi (Android Environment): Document lossage
with SIGSTOP.
* exec/exec.c (exec_0): Check X_OK on file being opened.  Also
handle /proc/self/exe.

doc/emacs/android.texi
exec/exec.c

index f2bcc50df232f9f3e88de1f838a2c12cccd0a38c..d7fadd69e4b13c852b39cb1093ad834387ee229e 100644 (file)
@@ -293,6 +293,11 @@ loader.  As a result, @code{interrupt-process}, and other related
 functions will work correctly, but using the process ID returned by
 @code{process-id} for other purposes will not.
 
+  One side effect of the mechanism by which process tracing is carried
+out is that job control facilities will not be able to stop
+subprocesses, and the @code{SIGSTOP} signal will appear to have no
+effect.
+
   In addition, Android 12 also terminates subprocesses which are
 consuming CPU while Emacs itself is in the background.  The system
 determines which processes are consuming too much CPU in intervals of
index 1705142865809a23cc735e6a267b3d6a0204146b..a15386b51bb3feeb92fe30500431aeb23e0adacd 100644 (file)
@@ -961,52 +961,68 @@ exec_0 (char *name, struct exec_tracee *tracee,
   ssize_t link_size;
   size_t remaining;
 
-  /* If name is not absolute, then make it relative to TRACEE's
-     cwd.  Use stpcpy, as sprintf is not reentrant.  */
+  /* If the process is trying to run /proc/self/exe, make it run
+     itself instead.  */
 
-  if (name[0] && name[0] != '/')
+  if (!strcmp (name, "/proc/self/exe") && tracee->exec_file)
     {
-      /* Clear `buffer'.  */
-      memset (buffer, 0, sizeof buffer);
-      memset (buffer1, 0, sizeof buffer);
+      strncpy (name, tracee->exec_file, PATH_MAX - 1);
+      name[PATH_MAX] = '\0';
+    }
+  else
+    {
+      /* If name is not absolute, then make it relative to TRACEE's
+        cwd.  Use stpcpy, as sprintf is not reentrant.  */
 
-      /* Copy over /proc, the PID, and /cwd/.  */
-      rewrite = stpcpy (buffer, "/proc/");
-      rewrite = format_pid (rewrite, tracee->pid);
-      stpcpy (rewrite, "/cwd");
+      if (name[0] && name[0] != '/')
+       {
+         /* Clear `buffer'.  */
+         memset (buffer, 0, sizeof buffer);
+         memset (buffer1, 0, sizeof buffer);
 
-      /* Resolve this symbolic link.  */
+         /* Copy over /proc, the PID, and /cwd/.  */
+         rewrite = stpcpy (buffer, "/proc/");
+         rewrite = format_pid (rewrite, tracee->pid);
+         stpcpy (rewrite, "/cwd");
 
-      link_size = readlink (buffer, buffer1,
-                           PATH_MAX + 1);
+         /* Resolve this symbolic link.  */
 
-      if (link_size < 0)
-       return NULL;
+         link_size = readlink (buffer, buffer1,
+                               PATH_MAX + 1);
 
-      /* Check that the name is a reasonable size.  */
+         if (link_size < 0)
+           return NULL;
 
-      if (link_size > PATH_MAX)
-       {
-         /* The name is too long.  */
-         errno = ENAMETOOLONG;
-         return NULL;
-       }
+         /* Check that the name is a reasonable size.  */
+
+         if (link_size > PATH_MAX)
+           {
+             /* The name is too long.  */
+             errno = ENAMETOOLONG;
+             return NULL;
+           }
 
-      /* Add a directory separator if necessary.  */
+         /* Add a directory separator if necessary.  */
       
-      if (!link_size || buffer1[link_size - 1] != '/')
-       buffer1[link_size] = '/', link_size++;
+         if (!link_size || buffer1[link_size - 1] != '/')
+           buffer1[link_size] = '/', link_size++;
 
-      rewrite = buffer1 + link_size;
-      remaining = buffer1 + sizeof buffer1 - rewrite - 1;
-      rewrite = stpncpy (rewrite, name, remaining);
+         rewrite = buffer1 + link_size;
+         remaining = buffer1 + sizeof buffer1 - rewrite - 1;
+         rewrite = stpncpy (rewrite, name, remaining);
 
-      /* Replace name with buffer1.  */
+         /* Replace name with buffer1.  */
 #ifndef REENTRANT
-      strcpy (name, buffer1);
+         strcpy (name, buffer1);
 #endif /* REENTRANT */
+       }
     }
 
+  /* Check that the file is accessible and executable.  */
+
+  if (access (name, X_OK))
+    return NULL;
+
   fd = open (name, O_RDONLY);
   if (fd < 0)
     return NULL;