summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-André Lemburg <mal@egenix.com>2001-09-20 17:22:58 (GMT)
committerMarc-André Lemburg <mal@egenix.com>2001-09-20 17:22:58 (GMT)
commit3508e308613055ea28bfb766828f03cc08a6789b (patch)
treeaf687cb55be863ce0a3db628f2e3c9e78a6c389c
parent5e89bd656f6cb48ada3547af4303a923902145e8 (diff)
downloadcpython-3508e308613055ea28bfb766828f03cc08a6789b.zip
cpython-3508e308613055ea28bfb766828f03cc08a6789b.tar.gz
cpython-3508e308613055ea28bfb766828f03cc08a6789b.tar.bz2
Fix Unicode .join() method to raise a TypeError for sequence
elements which are not Unicode objects or strings. (This matches the string.join() behaviour.) Fix a memory leak in the .join() method which occurs in case the Unicode resize fails. Restore the test_unicode output.
-rw-r--r--Lib/test/output/test_unicode1
-rw-r--r--Objects/unicodeobject.c12
2 files changed, 11 insertions, 2 deletions
diff --git a/Lib/test/output/test_unicode b/Lib/test/output/test_unicode
index 11c9c80..783a486 100644
--- a/Lib/test/output/test_unicode
+++ b/Lib/test/output/test_unicode
@@ -1,5 +1,4 @@
test_unicode
-* <built-in method join of unicode object at 0x81b3ba0> u' ' <class exceptions.TypeError at 0x80fac4c> u'7 hello 123'
Testing Unicode comparisons... done.
Testing Unicode contains method... done.
Testing Unicode formatting strings... done.
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 896e80f..c8c07a6 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3197,6 +3197,14 @@ PyObject *PyUnicode_Join(PyObject *separator,
}
if (!PyUnicode_Check(item)) {
PyObject *v;
+ if (!PyString_Check(item)) {
+ PyErr_Format(PyExc_TypeError,
+ "sequence item %i: expected string or Unicode,"
+ " %.80s found",
+ i, item->ob_type->tp_name);
+ Py_DECREF(item);
+ goto onError;
+ }
v = PyUnicode_FromObject(item);
Py_DECREF(item);
item = v;
@@ -3205,8 +3213,10 @@ PyObject *PyUnicode_Join(PyObject *separator,
}
itemlen = PyUnicode_GET_SIZE(item);
while (reslen + itemlen + seplen >= sz) {
- if (_PyUnicode_Resize(&res, sz*2))
+ if (_PyUnicode_Resize(&res, sz*2)) {
+ Py_DECREF(item);
goto onError;
+ }
sz *= 2;
p = PyUnicode_AS_UNICODE(res) + reslen;
}