Index: Modules/_ssl.c =================================================================== --- Modules/_ssl.c (révision 80401) +++ Modules/_ssl.c (copie de travail) @@ -417,20 +417,32 @@ int server_side = 0; int verification_mode = PY_SSL_CERT_NONE; int protocol = PY_SSL_VERSION_SSL23; + PyObject *cacerts_file_obj = NULL; + PyObject *key_file_bytes = NULL, *cert_file_bytes = NULL, *cacerts_file_bytes = NULL; char *key_file = NULL; char *cert_file = NULL; char *cacerts_file = NULL; char *ciphers = NULL; + PyObject *ssl = NULL; - if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap", + if (!PyArg_ParseTuple(args, "O!iO&O&|iiOz:sslwrap", PySocketModule.Sock_Type, &Sock, &server_side, - &key_file, &cert_file, + PyUnicode_FSConverter, &key_file_bytes, + PyUnicode_FSConverter, &cert_file_bytes, &verification_mode, &protocol, - &cacerts_file, &ciphers)) + &cacerts_file_obj, &ciphers)) return NULL; + key_file = PyBytes_AsString(key_file_bytes); + cert_file = PyBytes_AsString(cert_file_bytes); + if (cacerts_file_obj != Py_None && cacerts_file_obj != NULL) { + if (PyUnicode_FSConverter(cacerts_file_obj, &cacerts_file_bytes) == 0) + goto finally; + cacerts_file = PyBytes_AsString(cacerts_file_bytes); + } + /* fprintf(stderr, "server_side is %d, keyfile %p, certfile %p, verify_mode %d, " @@ -439,10 +451,16 @@ protocol, cacerts_file); */ - return (PyObject *) newPySSLObject(Sock, key_file, cert_file, + ssl = (PyObject *) newPySSLObject(Sock, key_file, cert_file, server_side, verification_mode, protocol, cacerts_file, ciphers); + +finally: + Py_XDECREF(key_file_bytes); + Py_XDECREF(cert_file_bytes); + Py_XDECREF(cacerts_file_bytes); + return ssl; } PyDoc_STRVAR(ssl_doc, @@ -946,13 +964,14 @@ PySSL_test_decode_certificate (PyObject *mod, PyObject *args) { PyObject *retval = NULL; - char *filename = NULL; + PyObject *filename_obj = NULL; + char *filename; X509 *x=NULL; BIO *cert; int verbose = 1; - if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", - &filename, &verbose)) + if (!PyArg_ParseTuple(args, "O&|i:test_decode_certificate", + PyUnicode_FSConverter, &filename_obj, &verbose)) return NULL; if ((cert=BIO_new(BIO_s_file())) == NULL) { @@ -961,6 +980,7 @@ goto fail0; } + filename = PyBytes_AsString(filename_obj); if (BIO_read_filename(cert,filename) <= 0) { PyErr_SetString(PySSLErrorObject, "Can't open file"); @@ -977,8 +997,8 @@ retval = _decode_certificate(x, verbose); fail0: - if (cert != NULL) BIO_free(cert); + Py_DECREF(filename_obj); return retval; }