From 4a90ef03637fdc1bc63ee9be82fbf22cbaa68662 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Sat, 3 Mar 2012 02:35:32 +0100 Subject: =?UTF-8?q?Issue=20#14177:=20marshal.loads()=20now=20raises=20Type?= =?UTF-8?q?Error=20when=20given=20an=20unicode=20string.=20Patch=20by=20Gu?= =?UTF-8?q?ilherme=20Gon=C3=A7alves.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/test/test_exceptions.py | 2 +- Lib/test/test_marshal.py | 7 ++++++- Misc/ACKS | 1 + Misc/NEWS | 3 +++ Python/marshal.c | 8 ++++---- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 0a7ddd4..7a2dd0c 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -38,7 +38,7 @@ class ExceptionTests(unittest.TestCase): try: try: import marshal - marshal.loads('') + marshal.loads(b'') except EOFError: pass finally: diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index 9a25012..96a70ec 100644 --- a/Lib/test/test_marshal.py +++ b/Lib/test/test_marshal.py @@ -184,7 +184,7 @@ class BugsTestCase(unittest.TestCase): pass def test_loads_recursion(self): - s = 'c' + ('X' * 4*4) + '{' * 2**20 + s = b'c' + (b'X' * 4*4) + b'{' * 2**20 self.assertRaises(ValueError, marshal.loads, s) def test_recursion_limit(self): @@ -257,6 +257,11 @@ class BugsTestCase(unittest.TestCase): finally: support.unlink(support.TESTFN) + def test_loads_reject_unicode_strings(self): + # Issue #14177: marshal.loads() should not accept unicode strings + unicode_string = 'T' + self.assertRaises(TypeError, marshal.loads, unicode_string) + def test_main(): support.run_unittest(IntTestCase, diff --git a/Misc/ACKS b/Misc/ACKS index 3f9cff9..0028877 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -341,6 +341,7 @@ Johannes Gijsbers Michael Gilfix Christoph Gohlke Tim Golden +Guilherme Gonçalves Chris Gonnerman David Goodger Hans de Graaff diff --git a/Misc/NEWS b/Misc/NEWS index 9c854a2..d629840 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -130,6 +130,9 @@ Core and Builtins Library ------- +- Issue #14177: marshal.loads() now raises TypeError when given an unicode + string. Patch by Guilherme Gonçalves. + - Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying. Moreover, the implementation is now O(1) rather than diff --git a/Python/marshal.c b/Python/marshal.c index 7b1af44..3e2fbeb 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1383,7 +1383,7 @@ marshal_loads(PyObject *self, PyObject *args) char *s; Py_ssize_t n; PyObject* result; - if (!PyArg_ParseTuple(args, "s*:loads", &p)) + if (!PyArg_ParseTuple(args, "y*:loads", &p)) return NULL; s = p.buf; n = p.len; @@ -1400,10 +1400,10 @@ marshal_loads(PyObject *self, PyObject *args) } PyDoc_STRVAR(loads_doc, -"loads(string)\n\ +"loads(bytes)\n\ \n\ -Convert the string to a value. If no valid value is found, raise\n\ -EOFError, ValueError or TypeError. Extra characters in the string are\n\ +Convert the bytes object to a value. If no valid value is found, raise\n\ +EOFError, ValueError or TypeError. Extra characters in the input are\n\ ignored."); static PyMethodDef marshal_methods[] = { -- cgit v0.12