Kaydet (Commit) 06847b13 authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

Correct a crash when two successive unicode allocations fail with a MemoryError:

the freelist contained half-initialized objects with freed pointers.

The comment
/* XXX UNREF/NEWREF interface should be more symmetrical */
was copied from tupleobject.c, and appears in some other places.
I sign the petition.
üst ad960400
......@@ -1113,6 +1113,20 @@ class UnicodeTest(
# will fail
self.assertRaises(UnicodeEncodeError, "foo{0}".format, u'\u1000bar')
def test_raiseMemError(self):
# Ensure that the freelist contains a consistent object, even
# when a string allocation fails with a MemoryError.
# This used to crash the interpreter,
# or leak references when the number was smaller.
try:
u"a" * (sys.maxint // 2 - 100)
except MemoryError:
pass
try:
u"a" * (sys.maxint // 2 - 100)
except MemoryError:
pass
def test_main():
test_support.run_unittest(__name__)
......
......@@ -315,7 +315,7 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
if ((unicode->length < length) &&
unicode_resize(unicode, length) < 0) {
PyObject_DEL(unicode->str);
goto onError;
unicode->str = NULL;
}
}
else {
......@@ -352,6 +352,8 @@ PyUnicodeObject *_PyUnicode_New(Py_ssize_t length)
return unicode;
onError:
/* XXX UNREF/NEWREF interface should be more symmetrical */
_Py_DEC_REFTOTAL;
_Py_ForgetReference((PyObject *)unicode);
PyObject_Del(unicode);
return NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment