From 3508e308613055ea28bfb766828f03cc08a6789b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Lemburg?= Date: Thu, 20 Sep 2001 17:22:58 +0000 Subject: [PATCH] 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. --- Lib/test/output/test_unicode | 1 - Objects/unicodeobject.c | 12 +++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Lib/test/output/test_unicode b/Lib/test/output/test_unicode index 11c9c80d19..783a4860ab 100644 --- a/Lib/test/output/test_unicode +++ b/Lib/test/output/test_unicode @@ -1,5 +1,4 @@ test_unicode -* u' ' 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 896e80f794..c8c07a613b 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; } -- 2.50.1