changeset 76493:e5e12c57c640

(sigchld_handler): Change type of pid to pid_t. Scan deleted_pid_list explicitly to avoid using Fmember which don't know about mark bits and make_fixnum_or_float which may malloc. Reported by Andreas Schwab.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 17 Mar 2007 18:16:03 +0000
parents 540a9c31e1c6
children f0a25b5d3ba0
files src/process.c
diffstat 1 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/process.c	Sat Mar 17 18:09:34 2007 +0000
+++ b/src/process.c	Sat Mar 17 18:16:03 2007 +0000
@@ -6486,7 +6486,7 @@
 
   while (1)
     {
-      register EMACS_INT pid;
+      pid_t pid;
       WAITTYPE w;
       Lisp_Object tail;
 
@@ -6530,11 +6530,15 @@
       /* Find the process that signaled us, and record its status.  */
 
       /* The process can have been deleted by Fdelete_process.  */
-      tail = Fmember (make_fixnum_or_float (pid), deleted_pid_list);
-      if (!NILP (tail))
+      for (tail = deleted_pid_list; GC_CONSP (tail); tail = XCDR (tail))
 	{
-	  Fsetcar (tail, Qnil);
-	  goto sigchld_end_of_loop;
+	  Lisp_Object xpid = XCAR (tail);
+	  if ((GC_INTEGERP (xpid) && pid == (pid_t) XINT (xpid))
+	      || (GC_FLOATP (xpid) && pid == (pid_t) XFLOAT_DATA (xpid)))
+	    {
+	      XSETCAR (tail, Qnil);
+	      goto sigchld_end_of_loop;
+	    }
 	}
 
       /* Otherwise, if it is asynchronous, it is in Vprocess_alist.  */