Issue #16475 : Correctly handle the EOF when reading marshal streams.
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 @@
         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 @@
     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 @@
         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 @@
 
     switch (type) {
 
-    case EOF:
-        PyErr_SetString(PyExc_EOFError,
-                        "EOF read where object expected");
-        retval = NULL;
-        break;
-
     case TYPE_NULL:
         retval = NULL;
         break;