Skip to content

Commit d5cae6f

Browse files
committed
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
for TYPE_DICT and stop immedialty on first r_object() failure
1 parent b1b7b18 commit d5cae6f

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

Python/marshal.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,7 @@ r_object(RFILE *p)
11171117
R_REF(v);
11181118
if (v == NULL)
11191119
break;
1120+
11201121
for (i = 0; i < n; i++) {
11211122
v2 = r_object(p);
11221123
if ( v2 == NULL ) {
@@ -1170,10 +1171,17 @@ r_object(RFILE *p)
11701171
if (key == NULL)
11711172
break;
11721173
val = r_object(p);
1173-
if (val != NULL)
1174-
PyDict_SetItem(v, key, val);
1174+
if (val == NULL) {
1175+
Py_DECREF(key);
1176+
break;
1177+
}
1178+
if (PyDict_SetItem(v, key, val) < 0) {
1179+
Py_DECREF(key);
1180+
Py_DECREF(val);
1181+
break;
1182+
}
11751183
Py_DECREF(key);
1176-
Py_XDECREF(val);
1184+
Py_DECREF(val);
11771185
}
11781186
if (PyErr_Occurred()) {
11791187
Py_DECREF(v);
@@ -1204,6 +1212,7 @@ r_object(RFILE *p)
12041212
}
12051213
if (v == NULL)
12061214
break;
1215+
12071216
for (i = 0; i < n; i++) {
12081217
v2 = r_object(p);
12091218
if ( v2 == NULL ) {

0 commit comments

Comments
 (0)