mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
bpo-36279: Ensure os.wait3() rusage is initialized (GH-15111)
Co-Authored-By: David Wilson <dw@botanicus.net>
This commit is contained in:
parent
d91d4de317
commit
682107cf45
3 changed files with 25 additions and 0 deletions
|
|
@ -2,6 +2,8 @@
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
import time
|
import time
|
||||||
import unittest
|
import unittest
|
||||||
from test.fork_wait import ForkWait
|
from test.fork_wait import ForkWait
|
||||||
|
|
@ -31,6 +33,22 @@ class Wait3Test(ForkWait):
|
||||||
self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))
|
self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))
|
||||||
self.assertTrue(rusage)
|
self.assertTrue(rusage)
|
||||||
|
|
||||||
|
def test_wait3_rusage_initialized(self):
|
||||||
|
# Ensure a successful wait3() call where no child was ready to report
|
||||||
|
# its exit status does not return uninitialized memory in the rusage
|
||||||
|
# structure. See bpo-36279.
|
||||||
|
args = [sys.executable, '-c', 'import sys; sys.stdin.read()']
|
||||||
|
proc = subprocess.Popen(args, stdin=subprocess.PIPE)
|
||||||
|
try:
|
||||||
|
pid, status, rusage = os.wait3(os.WNOHANG)
|
||||||
|
self.assertEqual(0, pid)
|
||||||
|
self.assertEqual(0, status)
|
||||||
|
self.assertEqual(0, sum(rusage))
|
||||||
|
finally:
|
||||||
|
proc.stdin.close()
|
||||||
|
proc.wait()
|
||||||
|
|
||||||
|
|
||||||
def tearDownModule():
|
def tearDownModule():
|
||||||
reap_children()
|
reap_children()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Fix potential use of uninitialized memory in :func:`os.wait3`.
|
||||||
|
|
@ -7489,6 +7489,12 @@ wait_helper(pid_t pid, int status, struct rusage *ru)
|
||||||
if (pid == -1)
|
if (pid == -1)
|
||||||
return posix_error();
|
return posix_error();
|
||||||
|
|
||||||
|
// If wait succeeded but no child was ready to report status, ru will not
|
||||||
|
// have been populated.
|
||||||
|
if (pid == 0) {
|
||||||
|
memset(ru, 0, sizeof(*ru));
|
||||||
|
}
|
||||||
|
|
||||||
if (struct_rusage == NULL) {
|
if (struct_rusage == NULL) {
|
||||||
PyObject *m = PyImport_ImportModuleNoBlock("resource");
|
PyObject *m = PyImport_ImportModuleNoBlock("resource");
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue