Issue #8477: _ssl._test_decode_cert() supports str with surrogates and bytes
for the filename
diff --git a/Misc/NEWS b/Misc/NEWS
index 31adc03..c26de61 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -363,6 +363,9 @@
 Library
 -------
 
+- Issue #8477: _ssl._test_decode_cert() supports str with surrogates and bytes
+  for the filename
+
 - Issue #8550: Add first class ``SSLContext`` objects to the ssl module.
 
 - Issue #8681: Make the zlib module's error messages more informative when
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 39fec7b..d01fafd 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -811,13 +811,13 @@
 PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
 
     PyObject *retval = NULL;
-    char *filename = NULL;
+    PyObject *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, &verbose))
         return NULL;
 
     if ((cert=BIO_new(BIO_s_file())) == NULL) {
@@ -826,7 +826,7 @@
         goto fail0;
     }
 
-    if (BIO_read_filename(cert,filename) <= 0) {
+    if (BIO_read_filename(cert, PyBytes_AsString(filename)) <= 0) {
         PyErr_SetString(PySSLErrorObject,
                         "Can't open file");
         goto fail0;
@@ -842,7 +842,7 @@
     retval = _decode_certificate(x, verbose);
 
   fail0:
-
+    Py_DECREF(filename);
     if (cert != NULL) BIO_free(cert);
     return retval;
 }