From: Serhiy Storchaka Date: Tue, 29 Jan 2013 10:16:57 +0000 (+0200) Subject: Issue #16971: Fix a refleak in the charmap decoder. X-Git-Tag: v3.4.0a1~1501 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2aee6a6460d8e748ce5d44b15c8219a57c2be0b9;p=python Issue #16971: Fix a refleak in the charmap decoder. --- 2aee6a6460d8e748ce5d44b15c8219a57c2be0b9 diff --cc Objects/unicodeobject.c index 6eaccbe084,e8459138a8..cbd2870c1d --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@@ -7382,29 -7510,55 +7382,37 @@@ Error Py_DECREF(x); goto onError; } - if (unicode_putchar(&v, &outpos, value) < 0) { + - if (_PyUnicodeWriter_Prepare(&writer, 1, value) == -1) ++ if (_PyUnicodeWriter_Prepare(&writer, 1, value) == -1) { + Py_DECREF(x); goto onError; + } + PyUnicode_WRITE(writer.kind, writer.data, writer.pos, value); + writer.pos++; } else if (PyUnicode_Check(x)) { - if (PyUnicode_READY(x) == -1) - Py_ssize_t targetsize; - + if (PyUnicode_READY(x) == -1) { + Py_DECREF(x); goto onError; + } - targetsize = PyUnicode_GET_LENGTH(x); - - if (targetsize == 1) { - /* 1-1 mapping */ + if (PyUnicode_GET_LENGTH(x) == 1) { Py_UCS4 value = PyUnicode_READ_CHAR(x, 0); if (value == 0xFFFE) goto Undefined; - if (_PyUnicodeWriter_Prepare(&writer, 1, value) == -1) - if (unicode_putchar(&v, &outpos, value) < 0) { ++ if (_PyUnicodeWriter_Prepare(&writer, 1, value) == -1) { + Py_DECREF(x); goto onError; + } + PyUnicode_WRITE(writer.kind, writer.data, writer.pos, value); + writer.pos++; } - else if (targetsize > 1) { - /* 1-n mapping */ - if (targetsize > extrachars) { - /* resize first */ - Py_ssize_t needed = (targetsize - extrachars) + \ - (targetsize << 2); - extrachars += needed; - /* XXX overflow detection missing */ - if (unicode_resize(&v, - PyUnicode_GET_LENGTH(v) + needed) < 0) - { - Py_DECREF(x); - goto onError; - } - } - if (unicode_widen(&v, outpos, - PyUnicode_MAX_CHAR_VALUE(x)) < 0) { + else { + writer.overallocate = 1; - if (_PyUnicodeWriter_WriteStr(&writer, x) == -1) ++ if (_PyUnicodeWriter_WriteStr(&writer, x) == -1) { + Py_DECREF(x); goto onError; + } - PyUnicode_CopyCharacters(v, outpos, x, 0, targetsize); - outpos += targetsize; - extrachars -= targetsize; } - /* 1-0 mapping: skip the character */ } else { /* wrong return value */