From 61683625096676722dc487aa1e9894a5b604e220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Wed, 20 Mar 2013 14:26:33 -0700 Subject: [PATCH] Issue #16475 : Correctly handle the EOF when reading marshal streams. --- Lib/test/test_marshal.py | 5 +++++ Python/marshal.c | 18 +++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py index 16e6d817fbc..c817cafa575 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 4e552967f78..bd889393d14 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;