]> granicus.if.org Git - python/commitdiff
fix possible refleaks if PyUnicode_READY fails
authorBenjamin Peterson <benjamin@python.org>
Sat, 14 Jan 2012 18:37:31 +0000 (13:37 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 14 Jan 2012 18:37:31 +0000 (13:37 -0500)
Objects/unicodeobject.c

index 40c1bd83820291087c8fbff8e416ad71c57606b8..e97ce1f6e6c5727fca9969e5c9b13245ffb64250 100644 (file)
@@ -2488,8 +2488,12 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
                 PyObject *str;
                 assert(obj);
                 str = PyObject_Str(obj);
-                if (!str || PyUnicode_READY(str) == -1)
+                if (!str)
+                    goto fail;
+                if (PyUnicode_READY(str) == -1) {
+                    Py_DECREF(str);
                     goto fail;
+                }
                 argmaxchar = PyUnicode_MAX_CHAR_VALUE(str);
                 maxchar = Py_MAX(maxchar, argmaxchar);
                 n += PyUnicode_GET_LENGTH(str);
@@ -2503,8 +2507,12 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
                 PyObject *repr;
                 assert(obj);
                 repr = PyObject_Repr(obj);
-                if (!repr || PyUnicode_READY(repr) == -1)
+                if (!repr)
+                    goto fail;
+                if (PyUnicode_READY(repr) == -1) {
+                    Py_DECREF(repr);
                     goto fail;
+                }
                 argmaxchar = PyUnicode_MAX_CHAR_VALUE(repr);
                 maxchar = Py_MAX(maxchar, argmaxchar);
                 n += PyUnicode_GET_LENGTH(repr);
@@ -2518,8 +2526,12 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
                 PyObject *ascii;
                 assert(obj);
                 ascii = PyObject_ASCII(obj);
-                if (!ascii || PyUnicode_READY(ascii) == -1)
+                if (!ascii)
+                    goto fail;
+                if (PyUnicode_READY(ascii) == -1) {
+                    Py_DECREF(ascii);
                     goto fail;
+                }
                 argmaxchar = PyUnicode_MAX_CHAR_VALUE(ascii);
                 maxchar = Py_MAX(maxchar, argmaxchar);
                 n += PyUnicode_GET_LENGTH(ascii);