diff options
author | Richard Oudkerk <shibturn@gmail.com> | 2012-06-11 14:12:12 (GMT) |
---|---|---|
committer | Richard Oudkerk <shibturn@gmail.com> | 2012-06-11 14:12:12 (GMT) |
commit | 197651b4e38449c7fe4c13e7c6feebeb5c52d220 (patch) | |
tree | e971f5d149e409d59cc371d31caba75cf7525205 /Modules | |
parent | 2a2ce4f6739bf5c8ec490df16d10cec51e0442fa (diff) | |
download | cpython-197651b4e38449c7fe4c13e7c6feebeb5c52d220.zip cpython-197651b4e38449c7fe4c13e7c6feebeb5c52d220.tar.gz cpython-197651b4e38449c7fe4c13e7c6feebeb5c52d220.tar.bz2 |
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Patch by Hallvard B Furuseth.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_multiprocessing/socket_connection.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/Modules/_multiprocessing/socket_connection.c b/Modules/_multiprocessing/socket_connection.c index 7ebf338..1169c0a 100644 --- a/Modules/_multiprocessing/socket_connection.c +++ b/Modules/_multiprocessing/socket_connection.c @@ -117,7 +117,7 @@ static Py_ssize_t conn_recv_string(ConnectionObject *conn, char *buffer, size_t buflength, char **newbuffer, size_t maxlength) { - int res; + Py_ssize_t res; UINT32 ulength; *newbuffer = NULL; @@ -132,20 +132,23 @@ conn_recv_string(ConnectionObject *conn, char *buffer, if (ulength > maxlength) return MP_BAD_MESSAGE_LENGTH; - if (ulength <= buflength) { - Py_BEGIN_ALLOW_THREADS - res = _conn_recvall(conn->handle, buffer, (size_t)ulength); - Py_END_ALLOW_THREADS - return res < 0 ? res : ulength; - } else { - *newbuffer = PyMem_Malloc((size_t)ulength); - if (*newbuffer == NULL) + if (ulength > buflength) { + *newbuffer = buffer = PyMem_Malloc((size_t)ulength); + if (buffer == NULL) return MP_MEMORY_ERROR; - Py_BEGIN_ALLOW_THREADS - res = _conn_recvall(conn->handle, *newbuffer, (size_t)ulength); - Py_END_ALLOW_THREADS - return res < 0 ? (Py_ssize_t)res : (Py_ssize_t)ulength; } + + Py_BEGIN_ALLOW_THREADS + res = _conn_recvall(conn->handle, buffer, (size_t)ulength); + Py_END_ALLOW_THREADS + + if (res >= 0) { + res = (Py_ssize_t)ulength; + } else if (*newbuffer != NULL) { + PyMem_Free(*newbuffer); + *newbuffer = NULL; + } + return res; } /* |