Subject: bug#14862: closed (Re: 24.3.50; Subprocess invocation hangs)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 17 Jul 2013 01:47:02 +0000

Your bug report

#14862: 24.3.50; Subprocess invocation hangs

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
14862: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=14862
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: 24.3.50; Subprocess invocation hangs
From: YAMAMOTO Mitsuharu <[email-masked]>
To: Paul Eggert <[email-masked]>
Cc: [email-masked]
Date: Wed, 17 Jul 2013 10:45:55 +0900
List-Id: <debbugs-submit.debbugs.gnu.org>

>>>>> On Tue, 16 Jul 2013 00:07:30 -0700, Paul Eggert <[email-masked]> said:

> Thanks for reporting that.  I installed what I hope is a fix.  Could
> you please try trunk bzr 113430 or later, on one of those platforms?

Yes.  Subprocess invocation no longer hangs on Cent OS 5 or Mac OS X
10.6.  Closing the bug.

BTW, the transition from explicit file descriptor close before exec by
close-process-descs to the use of close-on-exec seems to work as a
workaround for a kernel bug on OS X 10.8, which causes kernel panic on
exit (Bug IDs 13682, 13726, 13799, 13901, 14119, and 14478).

				     YAMAMOTO Mitsuharu
				[email-masked]

Subject: 24.3.50; Subprocess invocation hangs
From: YAMAMOTO Mitsuharu <[email-masked]>
To: [email-masked]
Date: Sun, 14 Jul 2013 18:17:32 +0900
List-Id: <debbugs-submit.debbugs.gnu.org>

The following should only be reproducible on the platforms where
neither O_CLOEXEC nor O_NOINHERIT is available, such as CentOS 5 or
Mac OS X <= 10.6.

* Steps to reproduce

1. $ emacs -Q
2. M-x shell RET

* Result

Emacs hands, blocking at line 1897 in process.c:

  1889	      /* Wait for child_setup to complete in case that vfork is
  1890		 actually defined as fork.  The descriptor wait_child_setup[1]
  1891		 of a pipe is closed at the child side either by close-on-exec
  1892		 on successful execve or the _exit call in child_setup.  */
  1893	      {
  1894		char dummy;
  1895	
  1896		emacs_close (wait_child_setup[1]);
  1897		emacs_read (wait_child_setup[0], &dummy, 1);
  1898		emacs_close (wait_child_setup[0]);
  1899	      }

where wait_child_setup[] are intended to be close-on-exec:

  src/process.c:
  1670	  if (pipe2 (wait_child_setup, O_CLOEXEC) != 0)
  1671	    report_file_error ("Creating pipe", Qnil);

But O_CLOEXEC is actually defined as 0 on the platforms where neither
O_CLOEXEC nor O_NOINHERIT is available.

  lib/fcntl.in.h:
   194	#if !defined O_CLOEXEC && defined O_NOINHERIT
   195	/* Mingw spells it 'O_NOINHERIT'.  */
   196	# define O_CLOEXEC O_NOINHERIT
   197	#endif
   198	
   199	#ifndef O_CLOEXEC
   200	# define O_CLOEXEC 0
   201	#endif

As a result, the above pipe2 call does not set the close-on-exec flag
for the created file descriptors.

Just setting O_CLOEXEC to some non-zero value would cause another
problem, because emacs_open uses it for checking its availability:

  src/sysdep.c:
  2168	  if (! O_CLOEXEC && 0 <= fd)
  2169	    fcntl (fd, F_SETFD, FD_CLOEXEC);

				     YAMAMOTO Mitsuharu
				[email-masked]

In GNU Emacs 24.3.50.1 (i686-pc-linux-gnu, GTK+ Version 2.10.4)
 of 2013-07-14 on localhost.localdomain
Bzr revision: 113419 [email-masked]
Windowing system distributor `The X.Org Foundation', version 11.0.70101000
System Description:	CentOS release 5.9 (Final)