summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-09-12 09:41:58 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-09-12 09:41:58 (GMT)
commit52d61e485eeebcd3cc9ebdf0c762d100fc2916dc (patch)
tree8ceb570ecc0febab84cb2cecb6c40656171cd907 /Modules
parent288b5bf62431b24faaa9524969c8b762a2c43b8c (diff)
downloadcpython-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.c17
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;
}