Skip to content

Commit

Permalink
[3.12] pythongh-115886: Handle embedded null characters in shared mem…
Browse files Browse the repository at this point in the history
…ory name (pythonGH-115887)

shm_open() and shm_unlink() now check for embedded null characters in
the name and raise an error instead of silently truncating it.
(cherry picked from commit 79811ed)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
  • Loading branch information
serhiy-storchaka committed Feb 25, 2024
1 parent 671b6a3 commit 7561f86
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 3 deletions.
17 changes: 16 additions & 1 deletion Lib/test/_test_multiprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3933,6 +3933,21 @@ def _new_shm_name(self, prefix):
# test_multiprocessing_spawn, etc) in parallel.
return prefix + str(os.getpid())

def test_shared_memory_name_with_embedded_null(self):
name_tsmb = self._new_shm_name('test01_null')
sms = shared_memory.SharedMemory(name_tsmb, create=True, size=512)
self.addCleanup(sms.unlink)
with self.assertRaises(ValueError):
shared_memory.SharedMemory(name_tsmb + '\0a', create=False, size=512)
if shared_memory._USE_POSIX:
orig_name = sms._name
try:
sms._name = orig_name + '\0a'
with self.assertRaises(ValueError):
sms.unlink()
finally:
sms._name = orig_name

def test_shared_memory_basics(self):
name_tsmb = self._new_shm_name('test01_tsmb')
sms = shared_memory.SharedMemory(name_tsmb, create=True, size=512)
Expand Down Expand Up @@ -4067,7 +4082,7 @@ def test_shared_memory_recreate(self):
self.addCleanup(shm2.unlink)
self.assertEqual(shm2._name, names[1])

def test_invalid_shared_memory_cration(self):
def test_invalid_shared_memory_creation(self):
# Test creating a shared memory segment with negative size
with self.assertRaises(ValueError):
sms_invalid = shared_memory.SharedMemory(create=True, size=-1)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix silent truncation of the name with an embedded null character in
:class:`multiprocessing.shared_memory.SharedMemory`.
14 changes: 12 additions & 2 deletions Modules/_multiprocessing/posixshmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,15 @@ _posixshmem_shm_open_impl(PyObject *module, PyObject *path, int flags,
{
int fd;
int async_err = 0;
const char *name = PyUnicode_AsUTF8(path);
Py_ssize_t name_size;
const char *name = PyUnicode_AsUTF8AndSize(path, &name_size);
if (name == NULL) {
return -1;
}
if (strlen(name) != (size_t)name_size) {
PyErr_SetString(PyExc_ValueError, "embedded null character");
return -1;
}
do {
Py_BEGIN_ALLOW_THREADS
fd = shm_open(name, flags, mode);
Expand Down Expand Up @@ -81,10 +86,15 @@ _posixshmem_shm_unlink_impl(PyObject *module, PyObject *path)
{
int rv;
int async_err = 0;
const char *name = PyUnicode_AsUTF8(path);
Py_ssize_t name_size;
const char *name = PyUnicode_AsUTF8AndSize(path, &name_size);
if (name == NULL) {
return NULL;
}
if (strlen(name) != (size_t)name_size) {
PyErr_SetString(PyExc_ValueError, "embedded null character");
return NULL;
}
do {
Py_BEGIN_ALLOW_THREADS
rv = shm_unlink(name);
Expand Down

0 comments on commit 7561f86

Please sign in to comment.