diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-12-12 12:08:33 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-12-12 12:08:33 (GMT) |
commit | b0a82a6a7f0686f99e19cc04b498abcd2896b906 (patch) | |
tree | d3fe59d2ff36222b109a886eff57fc85d79a7637 /Objects | |
parent | 521dfb02dd754972f04cd77d80dd34fcf5ac9399 (diff) | |
download | cpython-b0a82a6a7f0686f99e19cc04b498abcd2896b906.zip cpython-b0a82a6a7f0686f99e19cc04b498abcd2896b906.tar.gz cpython-b0a82a6a7f0686f99e19cc04b498abcd2896b906.tar.bz2 |
Fix PyUnicode_Resize() for compact string: leave the string unchanged on error
Fix also PyUnicode_Resize() doc
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5c2d2a7..6edba5d 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -655,7 +655,6 @@ resize_compact(PyObject *unicode, Py_ssize_t length) share_wstr = _PyUnicode_SHARE_WSTR(unicode); if (length > ((PY_SSIZE_T_MAX - struct_size) / char_size - 1)) { - Py_DECREF(unicode); PyErr_NoMemory(); return NULL; } @@ -666,7 +665,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length) new_unicode = (PyObject *)PyObject_REALLOC((char *)unicode, new_size); if (new_unicode == NULL) { - PyObject_Del(unicode); + _Py_NewReference(unicode); PyErr_NoMemory(); return NULL; } @@ -834,8 +833,9 @@ _PyUnicode_New(Py_ssize_t length) new_size = sizeof(Py_UNICODE) * ((size_t)length + 1); _PyUnicode_WSTR(unicode) = (Py_UNICODE*) PyObject_MALLOC(new_size); if (!_PyUnicode_WSTR(unicode)) { + Py_DECREF(unicode); PyErr_NoMemory(); - goto onError; + return NULL; } /* Initialize the first element to guard against cases where @@ -860,13 +860,6 @@ _PyUnicode_New(Py_ssize_t length) _PyUnicode_UTF8_LENGTH(unicode) = 0; assert(_PyUnicode_CheckConsistency((PyObject *)unicode, 0)); return unicode; - - onError: - /* XXX UNREF/NEWREF interface should be more symmetrical */ - _Py_DEC_REFTOTAL; - _Py_ForgetReference((PyObject *)unicode); - PyObject_Del(unicode); - return NULL; } static const char* @@ -1506,15 +1499,10 @@ unicode_dealloc(register PyObject *unicode) PyObject_DEL(_PyUnicode_WSTR(unicode)); if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) PyObject_DEL(_PyUnicode_UTF8(unicode)); + if (!PyUnicode_IS_COMPACT(unicode) && _PyUnicode_DATA_ANY(unicode)) + PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); - if (PyUnicode_IS_COMPACT(unicode)) { - Py_TYPE(unicode)->tp_free(unicode); - } - else { - if (_PyUnicode_DATA_ANY(unicode)) - PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); - Py_TYPE(unicode)->tp_free(unicode); - } + Py_TYPE(unicode)->tp_free(unicode); } #ifdef Py_DEBUG @@ -1590,9 +1578,10 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length) } if (PyUnicode_IS_COMPACT(unicode)) { - *p_unicode = resize_compact(unicode, length); - if (*p_unicode == NULL) + PyObject *new_unicode = resize_compact(unicode, length); + if (new_unicode == NULL) return -1; + *p_unicode = new_unicode; assert(_PyUnicode_CheckConsistency(*p_unicode, 0)); return 0; } |