summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristján Valur Jónsson <sweskman@gmail.com>2013-03-20 21:26:33 (GMT)
committerKristján Valur Jónsson <sweskman@gmail.com>2013-03-20 21:26:33 (GMT)
commit61683625096676722dc487aa1e9894a5b604e220 (patch)
tree1b52998a07659e8d46dd4f58d600ae55f9419376
parente178187bf639f0af8cc9c2b97d5358918c4b2c9e (diff)
downloadcpython-61683625096676722dc487aa1e9894a5b604e220.zip
cpython-61683625096676722dc487aa1e9894a5b604e220.tar.gz
cpython-61683625096676722dc487aa1e9894a5b604e220.tar.bz2
Issue #16475 : Correctly handle the EOF when reading marshal streams.
-rw-r--r--Lib/test/test_marshal.py5
-rw-r--r--Python/marshal.c18
2 files changed, 14 insertions, 9 deletions
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 16e6d81..c817caf 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -283,6 +283,11 @@ class BugsTestCase(unittest.TestCase):
unicode_string = 'T'
self.assertRaises(TypeError, marshal.loads, unicode_string)
+ def _test_eof(self):
+ data = marshal.dumps(("hello", "dolly", None))
+ for i in range(len(data)):
+ self.assertRaises(EOFError, marshal.loads, data[0: i])
+
LARGE_SIZE = 2**31
pointer_size = 8 if sys.maxsize > 0xFFFFFFFF else 4
diff --git a/Python/marshal.c b/Python/marshal.c
index 4e55296..bd88939 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -808,10 +808,16 @@ r_object(RFILE *p)
PyObject *v, *v2;
Py_ssize_t idx = 0;
long i, n;
- int type = r_byte(p);
+ int type, code = r_byte(p);
int flag;
PyObject *retval;
+ if (code == EOF) {
+ PyErr_SetString(PyExc_EOFError,
+ "EOF read where object expected");
+ return NULL;
+ }
+
p->depth++;
if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
@@ -820,8 +826,8 @@ r_object(RFILE *p)
return NULL;
}
- flag = type & FLAG_REF;
- type = type & ~FLAG_REF;
+ flag = code & FLAG_REF;
+ type = code & ~FLAG_REF;
#define R_REF(O) do{\
if (flag) \
@@ -830,12 +836,6 @@ r_object(RFILE *p)
switch (type) {
- case EOF:
- PyErr_SetString(PyExc_EOFError,
- "EOF read where object expected");
- retval = NULL;
- break;
-
case TYPE_NULL:
retval = NULL;
break;