changeset: 99068:07a298572d93 branch: 3.5 parent: 99064:15b0ea7134da parent: 99067:aabe273b20ab user: Benjamin Peterson date: Wed Nov 11 22:14:08 2015 -0800 files: Misc/NEWS Modules/_ssl.c Modules/clinic/_ssl.c.h description: merge 3.5 (#25569) diff -r 15b0ea7134da -r 07a298572d93 Misc/NEWS --- a/Misc/NEWS Wed Nov 11 23:33:50 2015 -0600 +++ b/Misc/NEWS Wed Nov 11 22:14:08 2015 -0800 @@ -229,6 +229,8 @@ - Issue #24881: Fixed setting binary mode in Python implementation of FileIO on Windows and Cygwin. Patch from Akira Li. +- Issue #25569: Fix memory leak in SSLSocket.getpeercert(). + - Issue #25471: Sockets returned from accept() shouldn't appear to be nonblocking. diff -r 15b0ea7134da -r 07a298572d93 Modules/_ssl.c --- a/Modules/_ssl.c Wed Nov 11 23:33:50 2015 -0600 +++ b/Modules/_ssl.c Wed Nov 11 22:14:08 2015 -0800 @@ -1067,25 +1067,23 @@ static PyObject * _get_crl_dp(X509 *certificate) { STACK_OF(DIST_POINT) *dps; - int i, j, result; - PyObject *lst; + int i, j; + PyObject *lst, *res = NULL; #if OPENSSL_VERSION_NUMBER < 0x10001000L - dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, - NULL, NULL); + dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL); #else /* Calls x509v3_cache_extensions and sets up crldp */ X509_check_ca(certificate); dps = certificate->crldp; #endif - if (dps == NULL) { + if (dps == NULL) return Py_None; - } - - if ((lst = PyList_New(0)) == NULL) { - return NULL; - } + + lst = PyList_New(0); + if (lst == NULL) + goto done; for (i=0; i < sk_DIST_POINT_num(dps); i++) { DIST_POINT *dp; @@ -1098,6 +1096,7 @@ GENERAL_NAME *gn; ASN1_IA5STRING *uri; PyObject *ouri; + int err; gn = sk_GENERAL_NAME_value(gns, j); if (gn->type != GEN_URI) { @@ -1106,28 +1105,25 @@ uri = gn->d.uniformResourceIdentifier; ouri = PyUnicode_FromStringAndSize((char *)uri->data, uri->length); - if (ouri == NULL) { - Py_DECREF(lst); - return NULL; - } - result = PyList_Append(lst, ouri); + if (ouri == NULL) + goto done; + + err = PyList_Append(lst, ouri); Py_DECREF(ouri); - if (result < 0) { - Py_DECREF(lst); - return NULL; - } + if (err < 0) + goto done; } } - /* convert to tuple or None */ - if (PyList_Size(lst) == 0) { - Py_DECREF(lst); - return Py_None; - } else { - PyObject *tup; - tup = PyList_AsTuple(lst); - Py_DECREF(lst); - return tup; - } + + /* Convert to tuple. */ + res = (PyList_GET_SIZE(lst) > 0) ? PyList_AsTuple(lst) : Py_None; + + done: + Py_XDECREF(lst); +#if OPENSSL_VERSION_NUMBER < 0x10001000L + sk_DIST_POINT_free(dsp); +#endif + return res; } static PyObject *