diff -r 154ae3af0317 Lib/test/test_codeccallbacks.py --- a/Lib/test/test_codeccallbacks.py Fri Jan 09 16:40:38 2015 -0600 +++ b/Lib/test/test_codeccallbacks.py Sat Jan 10 05:34:19 2015 +0200 @@ -971,6 +971,19 @@ with self.assertRaises(TypeError): data.decode(encoding, "test.replacing") + def test_bug23215(self): + # This happens to be invalid for all the encodings in question + data = 100 * "\udc00" + encs = ("big5", "big5hkscs", "cp932", "cp949", "cp950", "euc_jis_2004", + "euc_jisx0213", "euc_jp", "euc_kr", "gb18030", "gb2312", "gbk", "hz", + "iso2022_jp", "iso2022_jp_1", "iso2022_jp_2", "iso2022_jp_2004", + "iso2022_jp_3", "iso2022_jp_ext", "iso2022_kr", "johab", + "shift_jis", "shift_jis_2004", "shift_jisx0213") + + codecs.register_error("test.ignore", codecs.ignore_errors) + + for enc in encs: + data.encode(enc, "test.ignore") if __name__ == "__main__": unittest.main() diff -r 154ae3af0317 Modules/cjkcodecs/multibytecodec.c --- a/Modules/cjkcodecs/multibytecodec.c Fri Jan 09 16:40:38 2015 -0600 +++ b/Modules/cjkcodecs/multibytecodec.c Sat Jan 10 05:34:19 2015 +0200 @@ -324,10 +324,12 @@ assert(PyBytes_Check(retstr)); retstrsize = PyBytes_GET_SIZE(retstr); - REQUIRE_ENCODEBUFFER(buf, retstrsize); + if(retstrsize > 0) { + REQUIRE_ENCODEBUFFER(buf, retstrsize); - memcpy(buf->outbuf, PyBytes_AS_STRING(retstr), retstrsize); - buf->outbuf += retstrsize; + memcpy(buf->outbuf, PyBytes_AS_STRING(retstr), retstrsize); + buf->outbuf += retstrsize; + } newpos = PyLong_AsSsize_t(PyTuple_GET_ITEM(retobj, 1)); if (newpos < 0 && !PyErr_Occurred())