diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-09-03 14:19:40 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-09-03 14:19:40 (GMT) |
commit | 38b8ae0f5b8a6165fbbfc5798e8a3067234af261 (patch) | |
tree | 17508fafddcec7f4389eebb534be3fb15de5b4eb /Python/codecs.c | |
parent | aba2466d09f62610b4cb5d7bf16f145053a8417a (diff) | |
download | cpython-38b8ae0f5b8a6165fbbfc5798e8a3067234af261.zip cpython-38b8ae0f5b8a6165fbbfc5798e8a3067234af261.tar.gz cpython-38b8ae0f5b8a6165fbbfc5798e8a3067234af261.tar.bz2 |
Issue #24993: Handle import error in namereplace error handler
Handle PyCapsule_Import() failure (exception) in PyCodec_NameReplaceErrors():
return immedialty NULL.
Diffstat (limited to 'Python/codecs.c')
-rw-r--r-- | Python/codecs.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/Python/codecs.c b/Python/codecs.c index 596bd80..d90bf73 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -966,7 +966,6 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) } static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL; -static int ucnhash_initialized = 0; PyObject *PyCodec_NameReplaceErrors(PyObject *exc) { @@ -988,17 +987,17 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) return NULL; if (!(object = PyUnicodeEncodeError_GetObject(exc))) return NULL; - if (!ucnhash_initialized) { + if (!ucnhash_CAPI) { /* load the unicode data module */ ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import( PyUnicodeData_CAPSULE_NAME, 1); - ucnhash_initialized = 1; + if (!ucnhash_CAPI) + return NULL; } for (i = start, ressize = 0; i < end; ++i) { /* object is guaranteed to be "ready" */ c = PyUnicode_READ_CHAR(object, i); - if (ucnhash_CAPI && - ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { + if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { replsize = 1+1+1+(int)strlen(buffer)+1; } else if (c >= 0x10000) { @@ -1021,8 +1020,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc) i < end; ++i) { c = PyUnicode_READ_CHAR(object, i); *outp++ = '\\'; - if (ucnhash_CAPI && - ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { + if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) { *outp++ = 'N'; *outp++ = '{'; strcpy((char *)outp, buffer); |