]> granicus.if.org Git - python/commitdiff
Issue #16475 : Correctly handle the EOF when reading marshal streams.
authorKristján Valur Jónsson <sweskman@gmail.com>
Wed, 20 Mar 2013 21:26:33 +0000 (14:26 -0700)
committerKristján Valur Jónsson <sweskman@gmail.com>
Wed, 20 Mar 2013 21:26:33 +0000 (14:26 -0700)
Lib/test/test_marshal.py
Python/marshal.c

index 16e6d817fbcab7f1199f3ffdf77bc5d37aae986a..c817cafa57521c9d27c824c06bbb98c6eed434a4 100644 (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
 
index 4e552967f783f048afb4d09319e7d9e476c28128..bd889393d146d470e8ea960a8f64ad9ed1299976 100644 (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;