Issue 32844: subprocess may incorrectly redirect a low fd to stderr if another low fd is closed (original) (raw)
When redirecting, subprocess attempts to achieve the following state: each fd to be redirected to is less than or equal to the fd it is redirected from, which is necessary because redirection occurs in the ascending order of destination descriptors. It fails to do so if a low fd (< 2) is redirected to stderr and another low fd is closed, which may lead to an incorrect redirection, for example:
$ cat test.py import os import subprocess import sys
os.close(0)
subprocess.call([sys.executable, '-c', 'import sys; print("Hello", file=sys.stderr)'], stdin=2, stderr=1)
$ python3 test.py 2>/dev/null $ python3 test.py >/dev/null Hello
Expected behavior: $ python3 test.py >/dev/null $ python3 test.py 2>/dev/null Hello