Issue #18408: Fix cjkcodecs decoders, add a new MBERR_EXCEPTION constant to
notify exceptions raised by the _PyUnicodeWriter API
diff --git a/Modules/cjkcodecs/cjkcodecs.h b/Modules/cjkcodecs/cjkcodecs.h
index 18cc02f..9e92db2 100644
--- a/Modules/cjkcodecs/cjkcodecs.h
+++ b/Modules/cjkcodecs/cjkcodecs.h
@@ -130,7 +130,7 @@
 #define OUTCHAR(c)                                                         \
     do {                                                                   \
         if (_PyUnicodeWriter_WriteChar(writer, (c)) < 0)                   \
-            return MBERR_TOOSMALL;                                         \
+            return MBERR_EXCEPTION;                                         \
     } while (0)
 
 #define OUTCHAR2(c1, c2)                                                   \
@@ -138,7 +138,7 @@
         Py_UCS4 _c1 = (c1);                                                \
         Py_UCS4 _c2 = (c2);                                                \
         if (_PyUnicodeWriter_Prepare(writer, 2, Py_MAX(_c1, c2)) < 0)      \
-            return MBERR_TOOSMALL;                                         \
+            return MBERR_EXCEPTION;                                         \
         PyUnicode_WRITE(writer->kind, writer->data, writer->pos, _c1);     \
         PyUnicode_WRITE(writer->kind, writer->data, writer->pos + 1, _c2); \
         writer->pos += 2;                                                  \
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 2a29b7d..3c5173f 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -384,6 +384,8 @@
             PyErr_SetString(PyExc_RuntimeError,
                             "internal codec error");
             return -1;
+        case MBERR_EXCEPTION:
+            return -1;
         default:
             PyErr_SetString(PyExc_RuntimeError,
                             "unknown runtime error");
diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h
index 3050aeb..7cde8e3 100644
--- a/Modules/cjkcodecs/multibytecodec.h
+++ b/Modules/cjkcodecs/multibytecodec.h
@@ -112,6 +112,7 @@
 #define MBERR_TOOSMALL          (-1) /* insufficient output buffer space */
 #define MBERR_TOOFEW            (-2) /* incomplete input buffer */
 #define MBERR_INTERNAL          (-3) /* internal runtime error */
+#define MBERR_EXCEPTION         (-4) /* an exception has been raised */
 
 #define ERROR_STRICT            (PyObject *)(1)
 #define ERROR_IGNORE            (PyObject *)(2)