diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-09-12 09:41:58 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-09-12 09:41:58 (GMT) |
commit | 52d61e485eeebcd3cc9ebdf0c762d100fc2916dc (patch) | |
tree | 8ceb570ecc0febab84cb2cecb6c40656171cd907 /Modules | |
parent | 288b5bf62431b24faaa9524969c8b762a2c43b8c (diff) | |
download | cpython-52d61e485eeebcd3cc9ebdf0c762d100fc2916dc.zip cpython-52d61e485eeebcd3cc9ebdf0c762d100fc2916dc.tar.gz cpython-52d61e485eeebcd3cc9ebdf0c762d100fc2916dc.tar.bz2 |
socket: Fix memory leak in sendmsg() and sendmsg_afalg()
Issue #27744:
* Release msg.msg_iov memory block.
* Release memory on PyMem_Malloc(controllen) failure
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/socketmodule.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 0490d71..eee607f 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -4072,11 +4072,13 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) if (ncmsgbufs > 0) { struct cmsghdr *cmsgh = NULL; - if ((msg.msg_control = controlbuf = - PyMem_Malloc(controllen)) == NULL) { + controlbuf = PyMem_Malloc(controllen); + if (controlbuf == NULL) { PyErr_NoMemory(); goto finally; } + msg.msg_control = controlbuf; + msg.msg_controllen = controllen; /* Need to zero out the buffer as a workaround for glibc's @@ -4141,8 +4143,10 @@ finally: PyBuffer_Release(&cmsgs[i].data); PyMem_Free(cmsgs); Py_XDECREF(cmsg_fast); - for (i = 0; i < ndatabufs; i++) + PyMem_Free(msg.msg_iov); + for (i = 0; i < ndatabufs; i++) { PyBuffer_Release(&databufs[i]); + } PyMem_Free(databufs); return retval; } @@ -4243,7 +4247,8 @@ sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds) controlbuf = PyMem_Malloc(controllen); if (controlbuf == NULL) { - return PyErr_NoMemory(); + PyErr_NoMemory(); + goto finally; } memset(controlbuf, 0, controllen); @@ -4315,8 +4320,10 @@ sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds) if (iv.buf != NULL) { PyBuffer_Release(&iv); } - for (i = 0; i < ndatabufs; i++) + PyMem_Free(msg.msg_iov); + for (i = 0; i < ndatabufs; i++) { PyBuffer_Release(&databufs[i]); + } PyMem_Free(databufs); return retval; } |