]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
fix two refcount bugs in new string_join implementation:
authorJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Jul 2000 03:28:17 +0000 (03:28 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Tue, 11 Jul 2000 03:28:17 +0000 (03:28 +0000)
1. PySequence_Fast_GET_ITEM is a macro and borrows a reference
2. The seq returned from PySequence_Fast must be decref'd

Objects/stringobject.c

index fd0a570c5f2f8c78b171d1f6628b5e2de466905b..2667fa9e70f6dd94cf2b3c32e85a16af6b1143a2 100644 (file)
@@ -774,22 +774,17 @@ string_join(PyStringObject *self, PyObject *args)
                if (!PyString_Check(item)){
                        if (PyUnicode_Check(item)) {
                                Py_DECREF(res);
-                               Py_DECREF(item);
                                return PyUnicode_Join((PyObject *)self, 
                                                      seq);
                        }
                        PyErr_Format(PyExc_TypeError,
                             "sequence item %i: expected string, %.80s found",
                                     i, item->ob_type->tp_name);
-                       Py_DECREF(item);
-                       Py_DECREF(seq);
                        goto finally;
                }
                slen = PyString_GET_SIZE(item);
                while (reslen + slen + seplen >= sz) {
                        if (_PyString_Resize(&res, sz*2)) {
-                               Py_DECREF(item);
-                               Py_DECREF(seq);
                                goto finally;
                        }
                        sz *= 2;
@@ -801,15 +796,16 @@ string_join(PyStringObject *self, PyObject *args)
                        reslen += seplen;
                }
                memcpy(p, PyString_AS_STRING(item), slen);
-               Py_DECREF(item);
                p += slen;
                reslen += slen;
        }
        if (_PyString_Resize(&res, reslen))
                goto finally;
+       Py_DECREF(seq);
        return res;
 
   finally:
+       Py_DECREF(seq);
        Py_DECREF(res);
        return NULL;
 }