]> granicus.if.org Git - python/commitdiff
Issue #24993: Handle import error in namereplace error handler
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 3 Sep 2015 14:19:40 +0000 (16:19 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 3 Sep 2015 14:19:40 +0000 (16:19 +0200)
Handle PyCapsule_Import() failure (exception) in PyCodec_NameReplaceErrors():
return immedialty NULL.

Python/codecs.c

index 596bd80818171df53bfd5288b81bfdec47afa7c5..d90bf7374d49faf424f08f77f8722c2b5121b735 100644 (file)
@@ -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);