[issue9074] [includes patch] subprocess module closes standard file descriptors when it should not

2010-06-24 Thread Keith Rarick

New submission from Keith Rarick k...@xph.us:

Transcript to reproduce in Python 2.6.5:

 import subprocess, sys
 subprocess.call(('echo', 'foo'), stderr=sys.stdout)
echo: write: Bad file descriptor
1
 

Expected behavior:

 import subprocess, sys
 subprocess.call(('echo', 'foo'), stderr=sys.stdout)
foo
0
 

This happens because we've asked the child's stderr to be redirected, but not 
its stdout. So in _execute_child, errwrite is 1 while c2pwrite is None. So fd 1 
(errwrite) correctly gets duped to 2. But then, since errwrite is not None and 
it's not in (p2cread, c2pwrite, 2), the child closes fd 1.

The equivalent thing happens if you supply stdout=sys.stderr and the child 
attempts to write to its stderr.

I've attached a patch to fix this. It simply adds 2 and 2 to the list of fds 
not to close for c2pwrite and errwrite, respectively.

This patch is against the 2.6.5 release.

There is also a workaround, in case anyone else is affected by this bug before 
a fix has been released:

 import os, subprocess, sys
 subprocess.call(('echo', 'foo'), stderr=os.dup(sys.stdout.fileno()))
foo
0
 

(There could be a similar bug relating to the child's stdin, but I haven't 
investigated that.)

--
components: IO
files: fd-close.patch
keywords: patch
messages: 108548
nosy: kr
priority: normal
severity: normal
status: open
title: [includes patch] subprocess module closes standard file descriptors when 
it should not
type: behavior
versions: Python 2.6
Added file: http://bugs.python.org/file17762/fd-close.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue9074
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue9074] [includes patch] subprocess module closes standard file descriptors when it should not

2010-06-24 Thread Keith Rarick

Keith Rarick k...@xph.us added the comment:

There was a typo in my description of the patch. It should read:

I've attached a patch to fix this. It simply adds 2 and *1* to the list of fds 
not to close for c2pwrite and errwrite, respectively.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue9074
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com