Mercurial > cpython-lru_cache-weakref
changeset 60667:eb30e662fd6a
Issue #8394: _ctypes.dlopen() accepts bytes, bytearray and str with
surrogates.
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Sun, 18 Apr 2010 00:00:44 +0000 |
| parents | 9ace55b29f7e |
| children | d419e7373370 |
| files | Misc/NEWS Modules/_ctypes/callproc.c |
| diffstat | 2 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/Misc/NEWS Sat Apr 17 23:52:21 2010 +0000 +++ b/Misc/NEWS Sun Apr 18 00:00:44 2010 +0000 @@ -315,6 +315,9 @@ 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.
--- a/Modules/_ctypes/callproc.c Sat Apr 17 23:52:21 2010 +0000 +++ b/Modules/_ctypes/callproc.c Sun Apr 18 00:00:44 2010 +0000 @@ -1371,7 +1371,8 @@ 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 @@ /* 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)
