From c1f4979e7019f6c1ce9e5a02c2e3f8ca146645bc Mon Sep 17 00:00:00 2001 From: Charalampos Stratakis Date: Mon, 11 Jul 2016 14:20:01 +0200 Subject: [PATCH] Allow the keyfile argument of SSLContext.load_cert_chain to be set to None --- Modules/_ssl.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 38eba1d..1786afd 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2445,8 +2445,8 @@ static PyObject * load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds) { char *kwlist[] = {"certfile", "keyfile", "password", NULL}; - PyObject *password = NULL; - char *certfile_bytes = NULL, *keyfile_bytes = NULL; + PyObject *keyfile = NULL, *keyfile_bytes = NULL, *password = NULL; + char *certfile_bytes = NULL; pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback; void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata; _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 }; @@ -2455,11 +2455,27 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds) errno = 0; ERR_clear_error(); if (!PyArg_ParseTupleAndKeywords(args, kwds, - "et|etO:load_cert_chain", kwlist, + "et|OO:load_cert_chain", kwlist, Py_FileSystemDefaultEncoding, &certfile_bytes, - Py_FileSystemDefaultEncoding, &keyfile_bytes, - &password)) + &keyfile, &password)) return NULL; + + if (keyfile && keyfile != Py_None) { + if (PyString_Check(keyfile)) { + Py_INCREF(keyfile); + keyfile_bytes = keyfile; + } else { + PyObject *u = PyUnicode_FromObject(keyfile); + if (!u) + goto error; + keyfile_bytes = PyUnicode_AsEncodedString( + u, Py_FileSystemDefaultEncoding, NULL); + Py_DECREF(u); + if (!keyfile_bytes) + goto error; + } + } + if (password && password != Py_None) { if (PyCallable_Check(password)) { pw_info.callable = password; @@ -2489,7 +2505,7 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds) } PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state); r = SSL_CTX_use_PrivateKey_file(self->ctx, - keyfile_bytes ? keyfile_bytes : certfile_bytes, + keyfile_bytes ? PyBytes_AS_STRING(keyfile_bytes) : certfile_bytes, SSL_FILETYPE_PEM); PySSL_END_ALLOW_THREADS_S(pw_info.thread_state); if (r != 1) { @@ -2521,8 +2537,8 @@ load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds) error: SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb); SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata); + Py_XDECREF(keyfile_bytes); PyMem_Free(pw_info.password); - PyMem_Free(keyfile_bytes); PyMem_Free(certfile_bytes); return NULL; } -- 2.7.4