summaryrefslogtreecommitdiffstats
path: root/Python/codecs.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-09-03 14:19:40 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-09-03 14:19:40 (GMT)
commit38b8ae0f5b8a6165fbbfc5798e8a3067234af261 (patch)
tree17508fafddcec7f4389eebb534be3fb15de5b4eb /Python/codecs.c
parentaba2466d09f62610b4cb5d7bf16f145053a8417a (diff)
downloadcpython-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.c12
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);