]> granicus.if.org Git - python/commitdiff
fix load_verify_locations on unicode paths (closes #22244)
authorBenjamin Peterson <benjamin@python.org>
Thu, 28 Aug 2014 13:33:21 +0000 (09:33 -0400)
committerBenjamin Peterson <benjamin@python.org>
Thu, 28 Aug 2014 13:33:21 +0000 (09:33 -0400)
Lib/test/test_ssl.py
Modules/_ssl.c

index a5785d00ddfe01777c78c2e419084a4e0e11967b..72a65b781745a2daae2c969f5fa9a3c221fb5908 100644 (file)
@@ -850,11 +850,14 @@ class ContextTests(unittest.TestCase):
         ctx.load_verify_locations(cafile=CERTFILE, capath=None)
         ctx.load_verify_locations(BYTES_CERTFILE)
         ctx.load_verify_locations(cafile=BYTES_CERTFILE, capath=None)
+        ctx.load_verify_locations(cafile=BYTES_CERTFILE.decode('utf-8'))
         self.assertRaises(TypeError, ctx.load_verify_locations)
         self.assertRaises(TypeError, ctx.load_verify_locations, None, None, None)
         with self.assertRaises(IOError) as cm:
             ctx.load_verify_locations(WRONGCERT)
         self.assertEqual(cm.exception.errno, errno.ENOENT)
+        with self.assertRaises(IOError):
+            ctx.load_verify_locations(u'')
         with self.assertRaisesRegexp(ssl.SSLError, "PEM lib"):
             ctx.load_verify_locations(BADCERT)
         ctx.load_verify_locations(CERTFILE, CAPATH)
index 5518032b26abad96e795728a786aec3ac25c9fcd..5069012b1ddc1576cc92f6422fe63a833a75c209 100644 (file)
@@ -2628,17 +2628,33 @@ load_verify_locations(PySSLContext *self, PyObject *args, PyObject *kwds)
     }
 
     if (cafile) {
-        cafile_bytes = PyString_AsEncodedObject(
-            cafile, Py_FileSystemDefaultEncoding, "strict");
-        if (!cafile_bytes) {
-            goto error;
+        if (PyString_Check(cafile)) {
+            Py_INCREF(cafile);
+            cafile_bytes = cafile;
+        } else {
+            PyObject *u = PyUnicode_FromObject(cafile);
+            if (!u)
+                goto error;
+            cafile_bytes = PyUnicode_AsEncodedString(
+                u, Py_FileSystemDefaultEncoding, NULL);
+            Py_DECREF(u);
+            if (!cafile_bytes)
+                goto error;
         }
     }
     if (capath) {
-        capath_bytes = PyString_AsEncodedObject(
-            capath, Py_FileSystemDefaultEncoding, "strict");
-        if (!capath_bytes) {
-            goto error;
+        if (PyString_Check(capath)) {
+            Py_INCREF(capath);
+            capath_bytes = capath;
+        } else {
+            PyObject *u = PyUnicode_FromObject(capath);
+            if (!u)
+                goto error;
+            capath_bytes = PyUnicode_AsEncodedString(
+                u, Py_FileSystemDefaultEncoding, NULL);
+            Py_DECREF(u);
+            if (!capath_bytes)
+                goto error;
         }
     }