[Python-checkins] cpython: fix some possible refleaks from PyUnicode_READY error conditions
benjamin.peterson
python-checkins at python.org
Mon Jan 2 16:00:50 CET 2012
http://hg.python.org/cpython/rev/d5cda62d0f8c
changeset: 74236:d5cda62d0f8c
user: Benjamin Peterson <benjamin at python.org>
date: Mon Jan 02 09:00:30 2012 -0600
summary:
fix some possible refleaks from PyUnicode_READY error conditions
files:
Objects/unicodeobject.c | 80 ++++++++++++++++++++--------
1 files changed, 56 insertions(+), 24 deletions(-)
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -9132,10 +9132,15 @@
Py_ssize_t len1, len2;
str_obj = PyUnicode_FromObject(str);
- if (!str_obj || PyUnicode_READY(str_obj) == -1)
+ if (!str_obj)
return -1;
sub_obj = PyUnicode_FromObject(substr);
- if (!sub_obj || PyUnicode_READY(sub_obj) == -1) {
+ if (!sub_obj) {
+ Py_DECREF(str_obj);
+ return -1;
+ }
+ if (PyUnicode_READY(substr) == -1 || PyUnicode_READY(str_obj) == -1) {
+ Py_DECREF(substr);
Py_DECREF(str_obj);
return -1;
}
@@ -9215,10 +9220,15 @@
Py_ssize_t result;
str = PyUnicode_FromObject(str);
- if (!str || PyUnicode_READY(str) == -1)
+ if (!str)
return -2;
sub = PyUnicode_FromObject(sub);
- if (!sub || PyUnicode_READY(sub) == -1) {
+ if (!sub) {
+ Py_DECREF(str);
+ return -2;
+ }
+ if (PyUnicode_READY(sub) == -1 || PyUnicode_READY(str) == -1) {
+ Py_DECREF(sub);
Py_DECREF(str);
return -2;
}
@@ -9857,8 +9867,12 @@
PyObject *list;
string = PyUnicode_FromObject(string);
- if (string == NULL || PyUnicode_READY(string) == -1)
- return NULL;
+ if (string == NULL)
+ return NULL;
+ if (PyUnicode_READY(string) == -1) {
+ Py_DECREF(string);
+ return NULL;
+ }
switch (PyUnicode_KIND(string)) {
case PyUnicode_1BYTE_KIND:
@@ -10650,14 +10664,16 @@
element->ob_type->tp_name);
return -1;
}
- if (PyUnicode_READY(sub) == -1)
- return -1;
str = PyUnicode_FromObject(container);
- if (!str || PyUnicode_READY(str) == -1) {
+ if (!str) {
Py_DECREF(sub);
return -1;
}
+ if (PyUnicode_READY(sub) == -1 || PyUnicode_READY(str) == -1) {
+ Py_DECREF(sub);
+ Py_DECREF(str);
+ }
kind1 = PyUnicode_KIND(str);
kind2 = PyUnicode_KIND(sub);
@@ -11936,20 +11952,25 @@
PyObject *result;
self = PyUnicode_FromObject(obj);
- if (self == NULL || PyUnicode_READY(self) == -1)
+ if (self == NULL)
return NULL;
str1 = PyUnicode_FromObject(subobj);
- if (str1 == NULL || PyUnicode_READY(str1) == -1) {
+ if (str1 == NULL) {
Py_DECREF(self);
return NULL;
}
str2 = PyUnicode_FromObject(replobj);
- if (str2 == NULL || PyUnicode_READY(str2)) {
+ if (str2 == NULL) {
Py_DECREF(self);
Py_DECREF(str1);
return NULL;
}
- result = replace(self, str1, str2, maxcount);
+ if (PyUnicode_READY(self) == -1 ||
+ PyUnicode_READY(str1) == -1 ||
+ PyUnicode_READY(str2) == -1)
+ result = NULL;
+ else
+ result = replace(self, str1, str2, maxcount);
Py_DECREF(self);
Py_DECREF(str1);
Py_DECREF(str2);
@@ -11973,18 +11994,20 @@
if (!PyArg_ParseTuple(args, "OO|n:replace", &str1, &str2, &maxcount))
return NULL;
- if (!PyUnicode_READY(self) == -1)
+ if (PyUnicode_READY(self) == -1)
return NULL;
str1 = PyUnicode_FromObject(str1);
- if (str1 == NULL || PyUnicode_READY(str1) == -1)
+ if (str1 == NULL)
return NULL;
str2 = PyUnicode_FromObject(str2);
- if (str2 == NULL || PyUnicode_READY(str2) == -1) {
+ if (str2 == NULL) {
Py_DECREF(str1);
return NULL;
}
-
- result = replace(self, str1, str2, maxcount);
+ if (PyUnicode_READY(str1) == -1 || PyUnicode_READY(str2) == -1)
+ result = NULL;
+ else
+ result = replace(self, str1, str2, maxcount);
Py_DECREF(str1);
Py_DECREF(str2);
@@ -12299,10 +12322,15 @@
Py_ssize_t len1, len2;
str_obj = PyUnicode_FromObject(str_in);
- if (!str_obj || PyUnicode_READY(str_obj) == -1)
+ if (!str_obj)
return NULL;
sep_obj = PyUnicode_FromObject(sep_in);
- if (!sep_obj || PyUnicode_READY(sep_obj) == -1) {
+ if (!sep_obj) {
+ Py_DECREF(str_obj);
+ return NULL;
+ }
+ if (PyUnicode_READY(sep_obj) == -1 || PyUnicode_READY(str_obj) == -1) {
+ Py_DECREF(sep_obj);
Py_DECREF(str_obj);
return NULL;
}
@@ -13227,8 +13255,10 @@
return NULL;
}
uformat = PyUnicode_FromObject(format);
- if (uformat == NULL || PyUnicode_READY(uformat) == -1)
- return NULL;
+ if (uformat == NULL)
+ return NULL;
+ if (PyUnicode_READY(uformat) == -1)
+ Py_DECREF(uformat);
if (_PyAccu_Init(&acc))
goto onError;
fmt = PyUnicode_DATA(uformat);
@@ -13729,8 +13759,10 @@
if (unicode == NULL)
return NULL;
assert(_PyUnicode_CHECK(unicode));
- if (PyUnicode_READY(unicode))
- return NULL;
+ if (PyUnicode_READY(unicode)) {
+ Py_DECREF(unicode);
+ return NULL;
+ }
self = type->tp_alloc(type, 0);
if (self == NULL) {
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list