Index: Modules/_ssl.c =================================================================== --- Modules/_ssl.c (révision 80231) +++ Modules/_ssl.c (copie de travail) @@ -406,6 +406,23 @@ return NULL; } +static int +ssl_convert_filename(PyObject *unicode, PyObject **as_bytes, char **as_cstr) +{ + if (unicode != Py_None) { + if (PyUnicode_FSConverter(unicode, as_bytes) == 0) + return 1; + if (PyBytes_Check(*as_bytes)) + *as_cstr = PyBytes_AS_STRING(*as_bytes); + else + *as_cstr = PyByteArray_AsString(*as_bytes); + } else { + *as_bytes = NULL; + *as_cstr = NULL; + } + return 0; +} + static PyObject * PySSL_sslwrap(PyObject *self, PyObject *args) { @@ -413,20 +430,30 @@ int server_side = 0; int verification_mode = PY_SSL_CERT_NONE; int protocol = PY_SSL_VERSION_SSL23; + PyObject *key_file_obj = NULL, *cert_file_obj = NULL, *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!i|OOiiOz:sslwrap", PySocketModule.Sock_Type, &Sock, &server_side, - &key_file, &cert_file, + &key_file_obj, &cert_file_obj, &verification_mode, &protocol, - &cacerts_file, &ciphers)) + &cacerts_file_obj, &ciphers)) return NULL; + if (ssl_convert_filename(key_file_obj, &key_file_bytes, &key_file)) + goto finally; + if (ssl_convert_filename(cert_file_obj, &cert_file_bytes, &cert_file)) + goto finally; + if (ssl_convert_filename(cacerts_file_obj, &cacerts_file_bytes, &cacerts_file)) + goto finally; + /* fprintf(stderr, "server_side is %d, keyfile %p, certfile %p, verify_mode %d, " @@ -435,10 +462,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, @@ -942,13 +975,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) { @@ -957,6 +991,10 @@ goto fail0; } + if (PyBytes_Check(filename_obj)) + filename = PyBytes_AS_STRING(filename_obj); + else + filename = PyByteArray_AsString(filename_obj); if (BIO_read_filename(cert,filename) <= 0) { PyErr_SetString(PySSLErrorObject, "Can't open file"); @@ -973,8 +1011,8 @@ retval = _decode_certificate(x, verbose); fail0: - if (cert != NULL) BIO_free(cert); + Py_DECREF(filename_obj); return retval; }