Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
cd430c4d
Commit
cd430c4d
authored
Jul 27, 2011
by
Ross Lagerwall
Browse files
Options
Browse Files
Download
Plain Diff
Issue #12607: Merge with 3.2.
parents
e2ea1c7d
b20ace34
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
68 additions
and
0 deletions
+68
-0
Lib/test/test_subprocess.py
Lib/test/test_subprocess.py
+58
-0
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_posixsubprocess.c
Modules/_posixsubprocess.c
+7
-0
No files found.
Lib/test/test_subprocess.py
View file @
cd430c4d
...
...
@@ -1198,6 +1198,64 @@ class POSIXProcessTestCase(BaseTestCase):
for
fd
in
temp_fds
:
os
.
close
(
fd
)
def
check_swap_fds
(
self
,
stdin_no
,
stdout_no
,
stderr_no
):
# open up some temporary files
temps
=
[
mkstemp
()
for
i
in
range
(
3
)]
temp_fds
=
[
fd
for
fd
,
fname
in
temps
]
try
:
# unlink the files -- we won't need to reopen them
for
fd
,
fname
in
temps
:
os
.
unlink
(
fname
)
# save a copy of the standard file descriptors
saved_fds
=
[
os
.
dup
(
fd
)
for
fd
in
range
(
3
)]
try
:
# duplicate the temp files over the standard fd's 0, 1, 2
for
fd
,
temp_fd
in
enumerate
(
temp_fds
):
os
.
dup2
(
temp_fd
,
fd
)
# write some data to what will become stdin, and rewind
os
.
write
(
stdin_no
,
b"STDIN"
)
os
.
lseek
(
stdin_no
,
0
,
0
)
# now use those files in the given order, so that subprocess
# has to rearrange them in the child
p
=
subprocess
.
Popen
([
sys
.
executable
,
"-c"
,
'import sys; got = sys.stdin.read();'
'sys.stdout.write("got %s"%got); sys.stderr.write("err")'
],
stdin
=
stdin_no
,
stdout
=
stdout_no
,
stderr
=
stderr_no
)
p
.
wait
()
for
fd
in
temp_fds
:
os
.
lseek
(
fd
,
0
,
0
)
out
=
os
.
read
(
stdout_no
,
1024
)
err
=
support
.
strip_python_stderr
(
os
.
read
(
stderr_no
,
1024
))
finally
:
for
std
,
saved
in
enumerate
(
saved_fds
):
os
.
dup2
(
saved
,
std
)
os
.
close
(
saved
)
self
.
assertEqual
(
out
,
b"got STDIN"
)
self
.
assertEqual
(
err
,
b"err"
)
finally
:
for
fd
in
temp_fds
:
os
.
close
(
fd
)
# When duping fds, if there arises a situation where one of the fds is
# either 0, 1 or 2, it is possible that it is overwritten (#12607).
# This tests all combinations of this.
def
test_swap_fds
(
self
):
self
.
check_swap_fds
(
0
,
1
,
2
)
self
.
check_swap_fds
(
0
,
2
,
1
)
self
.
check_swap_fds
(
1
,
0
,
2
)
self
.
check_swap_fds
(
1
,
2
,
0
)
self
.
check_swap_fds
(
2
,
0
,
1
)
self
.
check_swap_fds
(
2
,
1
,
0
)
def
test_surrogates_error_message
(
self
):
def
prepare
():
raise
ValueError
(
"surrogate:
\
uDCff
"
)
...
...
Misc/NEWS
View file @
cd430c4d
...
...
@@ -237,6 +237,9 @@ Core and Builtins
Library
-------
- Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
given as a low fd, it gets overwritten.
- Issue #12590: IDLE editor window now always displays the first line
when opening a long file. With Tk 8.5, the first line was hidden.
...
...
Modules/_posixsubprocess.c
View file @
cd430c4d
...
...
@@ -69,6 +69,13 @@ static void child_exec(char *const exec_array[],
}
POSIX_CALL
(
close
(
errpipe_read
));
/* When duping fds, if there arises a situation where one of the fds is
either 0, 1 or 2, it is possible that it is overwritten (#12607). */
if
(
c2pwrite
==
0
)
POSIX_CALL
(
c2pwrite
=
dup
(
c2pwrite
));
if
(
errwrite
==
0
||
errwrite
==
1
)
POSIX_CALL
(
errwrite
=
dup
(
errwrite
));
/* Dup fds for child.
dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
would be a no-op (issue #10806). */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment