summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKoki Saito <49419225+saito828koki@users.noreply.github.com>2022-10-03 00:41:01 (GMT)
committerGitHub <noreply@github.com>2022-10-03 00:41:01 (GMT)
commit19ca114645bd8796cf4094e152b1fa9944da473d (patch)
treeb29d4dbc8ece5be4a1e2380fda58e2372bd63259
parent14d4f68ebb495fe7ccbaf283386d861a054d8288 (diff)
downloadcpython-19ca114645bd8796cf4094e152b1fa9944da473d.zip
cpython-19ca114645bd8796cf4094e152b1fa9944da473d.tar.gz
cpython-19ca114645bd8796cf4094e152b1fa9944da473d.tar.bz2
gh-96819: multiprocessing.resource_tracker: check if length of pipe write <= 512 (#96890)
Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
-rw-r--r--Lib/multiprocessing/resource_tracker.py4
-rw-r--r--Lib/test/_test_multiprocessing.py8
-rw-r--r--Misc/NEWS.d/next/Library/2022-09-17-13-15-10.gh-issue-96819.6RfqM7.rst1
3 files changed, 11 insertions, 2 deletions
diff --git a/Lib/multiprocessing/resource_tracker.py b/Lib/multiprocessing/resource_tracker.py
index cc42dbd..ea36950 100644
--- a/Lib/multiprocessing/resource_tracker.py
+++ b/Lib/multiprocessing/resource_tracker.py
@@ -161,10 +161,10 @@ class ResourceTracker(object):
def _send(self, cmd, name, rtype):
self.ensure_running()
msg = '{0}:{1}:{2}\n'.format(cmd, name, rtype).encode('ascii')
- if len(name) > 512:
+ if len(msg) > 512:
# posix guarantees that writes to a pipe of less than PIPE_BUF
# bytes are atomic, and that PIPE_BUF >= 512
- raise ValueError('name too long')
+ raise ValueError('msg too long')
nbytes = os.write(self._fd, msg)
assert nbytes == len(msg), "nbytes {0:n} but len(msg) {1:n}".format(
nbytes, len(msg))
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index a35e527..f74d8d7 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -5432,6 +5432,14 @@ class TestResourceTracker(unittest.TestCase):
self.assertTrue(is_resource_tracker_reused)
+ def test_too_long_name_resource(self):
+ # gh-96819: Resource names that will make the length of a write to a pipe
+ # greater than PIPE_BUF are not allowed
+ rtype = "shared_memory"
+ too_long_name_resource = "a" * (512 - len(rtype))
+ with self.assertRaises(ValueError):
+ resource_tracker.register(too_long_name_resource, rtype)
+
class TestSimpleQueue(unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2022-09-17-13-15-10.gh-issue-96819.6RfqM7.rst b/Misc/NEWS.d/next/Library/2022-09-17-13-15-10.gh-issue-96819.6RfqM7.rst
new file mode 100644
index 0000000..07b62a8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-09-17-13-15-10.gh-issue-96819.6RfqM7.rst
@@ -0,0 +1 @@
+Fixed check in :mod:`multiprocessing.resource_tracker` that guarantees that the length of a write to a pipe is not greater than ``PIPE_BUF``.