Mercurial > cpython-lru_cache-weakref
diff Python/marshal.c @ 86809:fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
for TYPE_DICT and stop immedialty on first r_object() failure
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Thu, 31 Oct 2013 17:14:52 +0100 |
| parents | 9e836a945ea9 |
| children | 995173ed248a |
line wrap: on
line diff
--- a/Python/marshal.c Thu Oct 31 17:07:08 2013 +0100 +++ b/Python/marshal.c Thu Oct 31 17:14:52 2013 +0100 @@ -1117,6 +1117,7 @@ R_REF(v); if (v == NULL) break; + for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) { @@ -1170,10 +1171,17 @@ 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 @@ } if (v == NULL) break; + for (i = 0; i < n; i++) { v2 = r_object(p); if ( v2 == NULL ) {
