summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2013-06-29 19:33:36 (GMT)
committerChristian Heimes <christian@cheimes.de>2013-06-29 19:33:36 (GMT)
commitd47802eef79c828e8c99ca176171ff8fa9401b14 (patch)
tree67d4e2a1ebeae36b0093b4b851678e8912bcbd84 /Objects
parentd47a0456b1120fe15bf2996a7acfd0e3340c6c9a (diff)
downloadcpython-d47802eef79c828e8c99ca176171ff8fa9401b14.zip
cpython-d47802eef79c828e8c99ca176171ff8fa9401b14.tar.gz
cpython-d47802eef79c828e8c99ca176171ff8fa9401b14.tar.bz2
Fix ref leak in error case of unicode find, count, formatlong
CID 983315: Resource leak (RESOURCE_LEAK) CID 983316: Resource leak (RESOURCE_LEAK) CID 983317: Resource leak (RESOURCE_LEAK)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/unicodeobject.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 501921d..ab1dbb9 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -10875,8 +10875,10 @@ unicode_count(PyObject *self, PyObject *args)
kind1 = PyUnicode_KIND(self);
kind2 = PyUnicode_KIND(substring);
- if (kind2 > kind1)
+ if (kind2 > kind1) {
+ Py_DECREF(substring);
return PyLong_FromLong(0);
+ }
kind = kind1;
buf1 = PyUnicode_DATA(self);
buf2 = PyUnicode_DATA(substring);
@@ -11054,10 +11056,14 @@ unicode_find(PyObject *self, PyObject *args)
&start, &end))
return NULL;
- if (PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1) {
+ Py_DECREF(substring);
return NULL;
- if (PyUnicode_READY(substring) == -1)
+ }
+ if (PyUnicode_READY(substring) == -1) {
+ Py_DECREF(substring);
return NULL;
+ }
result = any_find_slice(1, self, substring, start, end);
@@ -13581,12 +13587,14 @@ formatlong(PyObject *val, struct unicode_format_arg_t *arg)
/* To modify the string in-place, there can only be one reference. */
if (Py_REFCNT(result) != 1) {
+ Py_DECREF(result);
PyErr_BadInternalCall();
return NULL;
}
buf = PyUnicode_DATA(result);
llen = PyUnicode_GET_LENGTH(result);
if (llen > INT_MAX) {
+ Py_DECREF(result);
PyErr_SetString(PyExc_ValueError,
"string too large in _PyBytes_FormatLong");
return NULL;