Issue #16475 : Correctly handle the EOF when reading marshal streams.

This commit is contained in:
Kristján Valur Jónsson 2013-03-20 14:26:33 -07:00
parent e178187bf6
commit 6168362509
2 changed files with 14 additions and 9 deletions

View File

@ -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

View File

@ -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;