[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-03 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

This new patch makes tests more comprehensive (closes all combinations of the 
three standard fds).

--
Added file: http://bugs.python.org/file20242/sp3.patch

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-03 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

Committed in r87695 (3.2), r87696 (3.1) and r87697 (2.7).

--
resolution:  - fixed
stage:  - committed/rejected
status: open - closed
versions: +Python 2.7, Python 3.1

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Ross Lagerwall

New submission from Ross Lagerwall rosslagerw...@gmail.com:

There is an issue where if a python program closes all the std. file 
descriptors (e.g. a daemon) and then uses the subprocess module, the file 
descriptors may not be set up properly in the subprocess. This may actually be 
a fairly common use case in a daemon program that needs to run a subprocess and 
set up pipes to it.

Here is an example:

import os, subprocess, sys

x=os.open('/dev/null', os.O_RDWR)
os.close(0)
os.close(1)
os.close(2)

res = subprocess.Popen([sys.executable, -c,
  'import sys;'
  'sys.stdout.write(apple);'
  'sys.stdout.flush();'
  'sys.stderr.write(orange)'],
   stdin=x,
   stdout=subprocess.PIPE,
   stderr=subprocess.PIPE).communicate()
with open('/tmp/out', 'w') as f:
f.write(repr(res) + '\n')
f.write(repr((b'apple', b'orange')) + '\n')

The expected output in /tmp/out is:
('apple', 'orange')
('apple', 'orange')

but we get:
(b'', bFatal Python error: Py_Initialize: can't initialize sys standard 
streams\nOSError: [Errno 9] Bad file descriptor\n)
(b'apple', b'orange')

The problem comes about where the calls are made (this applies to the python  
c versions):
 os.dup2(p2cread, 0)
 os.dup2(c2pwrite, 1)
 os.dup2(errwrite, 2)

if c2pwrite or p2cread or errwrite is the same as what it's being dupped() to 
(eg if c2pwrite == 1) then the dup2 call does nothing. But, if we're using 
pipes, the close-on-exec flags are set initially and the dup2() call would 
normally remove the flag but it doesn't.

Attached is a patch which basically uses fcntl if necessary to remove the 
close-on-exec flag, and tests.

--
components: Library (Lib)
files: subprocess.patch
keywords: patch
messages: 125067
nosy: georg.brandl, giampaolo.rodola, gregory.p.smith, pitrou, rosslagerwall
priority: normal
severity: normal
status: open
title: Subprocess error if fds 0,1,2 are closed
type: behavior
versions: Python 3.2
Added file: http://bugs.python.org/file20223/subprocess.patch

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

 Attached is a patch which basically uses fcntl if necessary to remove
 the close-on-exec flag, and tests.

Python adds extra output at the end of stderr when compiled in debug
mode. Therefore you first have to strip that output, like this:

out, err = subprocess.Popen(...).communicate()
err = support.strip_python_stderr(err)
self.assertEqual((out, err), (b'apple', b'orange'))

Otherwise, looks good, thank you.

--

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Ross Lagerwall

Ross Lagerwall rosslagerw...@gmail.com added the comment:

Updated patch for debug mode. Does this also need to be applied for 3.1?

--
Added file: http://bugs.python.org/file20228/subprocess_v2.patch

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

 Updated patch for debug mode. Does this also need to be applied for 3.1?

Yes, but we can port it ourselves (unless you're really motivated)

--

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

Patch works fine, thank you. Here is an attempt at a slightly more readable 
code by refactoring.

--
Added file: http://bugs.python.org/file20230/sp.patch

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread Antoine Pitrou

Antoine Pitrou pit...@free.fr added the comment:

This further patch also addresses issue9905 (incorporating Ross' tests).

--
Added file: http://bugs.python.org/file20234/sp2.patch

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



[issue10806] Subprocess error if fds 0,1,2 are closed

2011-01-02 Thread STINNER Victor

STINNER Victor victor.stin...@haypocalc.com added the comment:

See also #6610 which has a patch with another test.

--
nosy: +haypo

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