summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-04-18 00:00:44 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-04-18 00:00:44 (GMT)
commit738446f0f7d2e1ca76dd70d59c02312992194644 (patch)
tree6f685576661267655057f38ee7814e23b41a6694
parenta7ecfe705fa9c902af59d45df0a2d66b495f2bff (diff)
downloadcpython-738446f0f7d2e1ca76dd70d59c02312992194644.zip
cpython-738446f0f7d2e1ca76dd70d59c02312992194644.tar.gz
cpython-738446f0f7d2e1ca76dd70d59c02312992194644.tar.bz2
Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
surrogates.
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/callproc.c19
2 files changed, 19 insertions, 3 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 62de9cb..89e2bf6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -315,6 +315,9 @@ C-API
Library
-------
+- Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
+ surrogates.
+
- Issue #850728: Add a *timeout* parameter to the `acquire()` method of
`threading.Semaphore` objects. Original patch by Torsten Landschoff.
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index 2a75fb1..022cceb 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1371,7 +1371,8 @@ copy_com_pointer(PyObject *self, PyObject *args)
static PyObject *py_dl_open(PyObject *self, PyObject *args)
{
- char *name;
+ PyObject *name, *name2;
+ char *name_str;
void * handle;
#ifdef RTLD_LOCAL
int mode = RTLD_NOW | RTLD_LOCAL;
@@ -1379,10 +1380,22 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
/* cygwin doesn't define RTLD_LOCAL */
int mode = RTLD_NOW;
#endif
- if (!PyArg_ParseTuple(args, "z|i:dlopen", &name, &mode))
+ if (!PyArg_ParseTuple(args, "O|i:dlopen", &name, &mode))
return NULL;
mode |= RTLD_NOW;
- handle = ctypes_dlopen(name, mode);
+ if (name != Py_None) {
+ if (PyUnicode_FSConverter(name, &name2) == 0)
+ return NULL;
+ if (PyBytes_Check(name2))
+ name_str = PyBytes_AS_STRING(name2);
+ else
+ name_str = PyByteArray_AS_STRING(name2);
+ } else {
+ name_str = NULL;
+ name2 = NULL;
+ }
+ handle = ctypes_dlopen(name_str, mode);
+ Py_XDECREF(name2);
if (!handle) {
char *errmsg = ctypes_dlerror();
if (!errmsg)