]> granicus.if.org Git - python/commitdiff
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 31 Oct 2013 16:14:52 +0000 (17:14 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 31 Oct 2013 16:14:52 +0000 (17:14 +0100)
for TYPE_DICT and stop immedialty on first r_object() failure

Python/marshal.c

index 598269fa722745e84e72f89ebbf95e29e6d4edc5..e19aff06d228ce51cecc0361d46b4188d77567ad 100644 (file)
@@ -1117,6 +1117,7 @@ r_object(RFILE *p)
         R_REF(v);
         if (v == NULL)
             break;
+
         for (i = 0; i < n; i++) {
             v2 = r_object(p);
             if ( v2 == NULL ) {
@@ -1170,10 +1171,17 @@ r_object(RFILE *p)
             if (key == NULL)
                 break;
             val = r_object(p);
-            if (val != NULL)
-                PyDict_SetItem(v, key, val);
+            if (val == NULL) {
+                Py_DECREF(key);
+                break;
+            }
+            if (PyDict_SetItem(v, key, val) < 0) {
+                Py_DECREF(key);
+                Py_DECREF(val);
+                break;
+            }
             Py_DECREF(key);
-            Py_XDECREF(val);
+            Py_DECREF(val);
         }
         if (PyErr_Occurred()) {
             Py_DECREF(v);
@@ -1204,6 +1212,7 @@ r_object(RFILE *p)
         }
         if (v == NULL)
             break;
+
         for (i = 0; i < n; i++) {
             v2 = r_object(p);
             if ( v2 == NULL ) {