Index: Lib/test/test_unicode.py =================================================================== --- Lib/test/test_unicode.py (revision 84710) +++ Lib/test/test_unicode.py (working copy) @@ -1395,10 +1395,11 @@ self.assertEqual(text, 'ascii\x7f=unicode\xe9') # non-ascii format, ascii argument - self.assertRaisesRegexp(ValueError, - '^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format ' - 'string, got a non-ascii byte: 0xe9$', - format_unicode, b'unicode\xe9=%s', 'ascii') + for format in (b'unicode\xe9=%s', b'%s=unicode\xe9'): + self.assertRaisesRegexp(ValueError, + '^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format ' + 'string, got a non-ascii byte: 0xe9$', + format_unicode, format, 'ascii') def test_main(): support.run_unittest(__name__) Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (revision 84710) +++ Objects/unicodeobject.c (working copy) @@ -1108,7 +1108,7 @@ "PyUnicode_FromFormatV() expects an ASCII-encoded format " "string, got a non-ascii byte: 0x%02x", (unsigned char)*f); - goto fail; + goto fail_to_fill; } else *s++ = *f; @@ -1133,6 +1133,18 @@ if (abuffer) PyObject_Free(abuffer); return NULL; + fail_to_fill: + Py_DECREF(string); + if (callresults) { + while (callresult < callresults + callcount) { + Py_DECREF(*callresult); + ++callresult; + } + PyObject_Free(callresults); + } + if (abuffer) + PyObject_Free(abuffer); + return NULL; } #undef appendstring