diff -r 8345fb616cbd Lib/test/test_csv.py --- a/Lib/test/test_csv.py Sun Aug 25 14:57:38 2013 +0200 +++ b/Lib/test/test_csv.py Sun Aug 25 23:17:48 2013 +0800 @@ -791,6 +791,15 @@ mydialect.lineterminator = 4 self.assertRaises(csv.Error, mydialect) + def test_invaliddelimiter(self): + class mydialect(csv.Dialect): + delimiter = b"," + + with self.assertRaises(csv.Error) as cm: + mydialect() + self.assertEqual(str(cm.exception), + '"delimiter" must be an 1-character string') + class TestSniffer(unittest.TestCase): sample1 = """\ diff -r 8345fb616cbd Modules/_csv.c --- a/Modules/_csv.c Sun Aug 25 14:57:38 2013 +0200 +++ b/Modules/_csv.c Sun Aug 25 23:17:48 2013 +0800 @@ -239,19 +239,21 @@ *target = '\0'; if (src != Py_None) { Py_ssize_t len; + if (!PyUnicode_Check(src)) + goto err; len = PyUnicode_GetLength(src); - if (len > 1) { - PyErr_Format(PyExc_TypeError, - "\"%s\" must be an 1-character string", - name); - return -1; - } + if (len > 1) + goto err; /* PyUnicode_READY() is called in PyUnicode_GetLength() */ if (len > 0) *target = PyUnicode_READ_CHAR(src, 0); } } return 0; +err: + PyErr_Format(PyExc_TypeError, + "\"%s\" must be an 1-character string", name); + return -1; } static int