Mercurial > cpython-lru_cache-weakref
diff Objects/unicodeobject.c @ 37261:bc5161f292b7 2.4
Fix the refleak from test_unicode.
Backport 42973 (lots of whitespace changes intermixed):
- Reindent a confusingly indented piece of code (no intended code changes
there)
- Add missing DECREFs of inner-scope 'temp' variable
- Add various missing DECREFs by changing 'return NULL' into 'goto onError'
- Avoid double DECREF when last _PyUnicode_Resize() fails
Coverity found one of the missing DECREFs, but oddly enough not the others.
| author | Neal Norwitz <nnorwitz@gmail.com> |
|---|---|
| date | Tue, 28 Mar 2006 06:05:21 +0000 |
| parents | accfb156f9cc |
| children | d8de7500291d |
line wrap: on
line diff
--- a/Objects/unicodeobject.c Mon Mar 27 21:47:54 2006 +0000 +++ b/Objects/unicodeobject.c Tue Mar 28 06:05:21 2006 +0000 @@ -7013,15 +7013,15 @@ /* nothing to do */; else if (PyString_Check(temp)) { /* convert to string to Unicode */ - unicode = PyUnicode_Decode(PyString_AS_STRING(temp), + unicode = PyUnicode_Decode(PyString_AS_STRING(temp), PyString_GET_SIZE(temp), - NULL, + NULL, "strict"); - Py_DECREF(temp); - temp = unicode; - if (temp == NULL) - goto onError; - } + Py_DECREF(temp); + temp = unicode; + if (temp == NULL) + goto onError; + } else { Py_DECREF(temp); PyErr_SetString(PyExc_TypeError, @@ -7117,11 +7117,13 @@ reslen += rescnt; if (reslen < 0) { Py_XDECREF(temp); - Py_DECREF(result); - return PyErr_NoMemory(); + PyErr_NoMemory(); + goto onError; } - if (_PyUnicode_Resize(&result, reslen) < 0) - return NULL; + if (_PyUnicode_Resize(&result, reslen) < 0) { + Py_XDECREF(temp); + goto onError; + } res = PyUnicode_AS_UNICODE(result) + reslen - rescnt; } @@ -7171,6 +7173,7 @@ if (dict && (argidx < arglen) && c != '%') { PyErr_SetString(PyExc_TypeError, "not all arguments converted during string formatting"); + Py_XDECREF(temp); goto onError; } Py_XDECREF(temp); @@ -7182,12 +7185,12 @@ goto onError; } + if (_PyUnicode_Resize(&result, reslen - rescnt) < 0) + goto onError; if (args_owned) { Py_DECREF(args); } Py_DECREF(uformat); - if (_PyUnicode_Resize(&result, reslen - rescnt) < 0) - goto onError; return (PyObject *)result; onError:
