bpo-40882: Fix a memory leak in SharedMemory on Windows (GH-20684)

In multiprocessing.shared_memory.SharedMemory(), the temporary view
returned by MapViewOfFile() should be unmapped when it is no longer
needed.
This commit is contained in:
Zackery Spytz 2022-11-25 09:39:48 -08:00 committed by GitHub
parent 8749121b07
commit 85c128e34d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 2 deletions

View File

@ -173,7 +173,10 @@ class SharedMemory:
)
finally:
_winapi.CloseHandle(h_map)
size = _winapi.VirtualQuerySize(p_buf)
try:
size = _winapi.VirtualQuerySize(p_buf)
finally:
_winapi.UnmapViewOfFile(p_buf)
self._mmap = mmap.mmap(-1, size, tagname=name)
self._size = size

View File

@ -0,0 +1,2 @@
Fix a memory leak in :class:`multiprocessing.shared_memory.SharedMemory` on
Windows.

View File

@ -1393,6 +1393,30 @@ _winapi_MapViewOfFile_impl(PyObject *module, HANDLE file_map,
return address;
}
/*[clinic input]
_winapi.UnmapViewOfFile
address: LPCVOID
/
[clinic start generated code]*/
static PyObject *
_winapi_UnmapViewOfFile_impl(PyObject *module, LPCVOID address)
/*[clinic end generated code: output=4f7e18ac75d19744 input=8c4b6119ad9288a3]*/
{
BOOL success;
Py_BEGIN_ALLOW_THREADS
success = UnmapViewOfFile(address);
Py_END_ALLOW_THREADS
if (!success) {
return PyErr_SetFromWindowsErr(0);
}
Py_RETURN_NONE;
}
/*[clinic input]
_winapi.OpenFileMapping -> HANDLE
@ -2062,6 +2086,7 @@ static PyMethodDef winapi_functions[] = {
_WINAPI_READFILE_METHODDEF
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
_WINAPI_TERMINATEPROCESS_METHODDEF
_WINAPI_UNMAPVIEWOFFILE_METHODDEF
_WINAPI_VIRTUALQUERYSIZE_METHODDEF
_WINAPI_WAITNAMEDPIPE_METHODDEF
_WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF

View File

@ -742,6 +742,32 @@ exit:
return return_value;
}
PyDoc_STRVAR(_winapi_UnmapViewOfFile__doc__,
"UnmapViewOfFile($module, address, /)\n"
"--\n"
"\n");
#define _WINAPI_UNMAPVIEWOFFILE_METHODDEF \
{"UnmapViewOfFile", (PyCFunction)_winapi_UnmapViewOfFile, METH_O, _winapi_UnmapViewOfFile__doc__},
static PyObject *
_winapi_UnmapViewOfFile_impl(PyObject *module, LPCVOID address);
static PyObject *
_winapi_UnmapViewOfFile(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
LPCVOID address;
if (!PyArg_Parse(arg, "" F_POINTER ":UnmapViewOfFile", &address)) {
goto exit;
}
return_value = _winapi_UnmapViewOfFile_impl(module, address);
exit:
return return_value;
}
PyDoc_STRVAR(_winapi_OpenFileMapping__doc__,
"OpenFileMapping($module, desired_access, inherit_handle, name, /)\n"
"--\n"
@ -1345,4 +1371,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args
exit:
return return_value;
}
/*[clinic end generated code: output=83c4a3f0e70e7775 input=a9049054013a1b77]*/
/*[clinic end generated code: output=23ea9e176d86e026 input=a9049054013a1b77]*/