Commit 682107cf authored by Zackery Spytz's avatar Zackery Spytz Committed by T. Wouters

bpo-36279: Ensure os.wait3() rusage is initialized (GH-15111)

Co-Authored-By: default avatarDavid Wilson <dw@botanicus.net>
parent d91d4de3
......@@ -2,6 +2,8 @@
"""
import os
import subprocess
import sys
import time
import unittest
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.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():
reap_children()
......
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)
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) {
PyObject *m = PyImport_ImportModuleNoBlock("resource");
if (m == NULL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment