summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2000-07-11 03:28:17 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2000-07-11 03:28:17 (GMT)
commit4904829dbf7d8867a5d8c89eeec2969a45448fd8 (patch)
tree4970c6e25112ae9e302e0a0e01970e3bffceb079 /Objects
parentdc0c031ad8018bce613b21405fcb58b0bdda60dc (diff)
downloadcpython-4904829dbf7d8867a5d8c89eeec2969a45448fd8.zip
cpython-4904829dbf7d8867a5d8c89eeec2969a45448fd8.tar.gz
cpython-4904829dbf7d8867a5d8c89eeec2969a45448fd8.tar.bz2
fix two refcount bugs in new string_join implementation:
1. PySequence_Fast_GET_ITEM is a macro and borrows a reference 2. The seq returned from PySequence_Fast must be decref'd
Diffstat (limited to 'Objects')
-rw-r--r--Objects/stringobject.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index fd0a570..2667fa9 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -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;
}