Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ea8c431

Browse files
Issue #24103: Fixed possible use after free in ElementTree.XMLPullParser.
2 parents f006940 + bc4ded9 commit ea8c431

2 files changed

Lines changed: 15 additions & 19 deletions

File tree

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ Core and Builtins
118118
Library
119119
-------
120120

121+
- Issue #24103: Fixed possible use after free in ElementTree.XMLPullParser.
122+
121123
- Issue #25860: os.fwalk() no longer skips remaining directories when error
122124
occurs. Original patch by Samson Lee.
123125

Modules/_elementtree.c

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3581,7 +3581,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
35813581
/*[clinic end generated code: output=1440092922b13ed1 input=abf90830a1c3b0fc]*/
35823582
{
35833583
/* activate element event reporting */
3584-
Py_ssize_t i, seqlen;
3584+
Py_ssize_t i;
35853585
TreeBuilderObject *target;
35863586
PyObject *events_append, *events_seq;
35873587

@@ -3599,8 +3599,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
35993599
events_append = PyObject_GetAttrString(events_queue, "append");
36003600
if (events_append == NULL)
36013601
return NULL;
3602-
Py_XDECREF(target->events_append);
3603-
target->events_append = events_append;
3602+
Py_SETREF(target->events_append, events_append);
36043603

36053604
/* clear out existing events */
36063605
Py_CLEAR(target->start_event_obj);
@@ -3619,46 +3618,41 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
36193618
return NULL;
36203619
}
36213620

3622-
seqlen = PySequence_Size(events_seq);
3623-
for (i = 0; i < seqlen; ++i) {
3621+
for (i = 0; i < PySequence_Size(events_seq); ++i) {
36243622
PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i);
36253623
char *event_name = NULL;
36263624
if (PyUnicode_Check(event_name_obj)) {
3627-
event_name = _PyUnicode_AsString(event_name_obj);
3625+
event_name = PyUnicode_AsUTF8(event_name_obj);
36283626
} else if (PyBytes_Check(event_name_obj)) {
36293627
event_name = PyBytes_AS_STRING(event_name_obj);
36303628
}
3631-
36323629
if (event_name == NULL) {
36333630
Py_DECREF(events_seq);
36343631
PyErr_Format(PyExc_ValueError, "invalid events sequence");
36353632
return NULL;
3636-
} else if (strcmp(event_name, "start") == 0) {
3637-
Py_INCREF(event_name_obj);
3638-
target->start_event_obj = event_name_obj;
3633+
}
3634+
3635+
Py_INCREF(event_name_obj);
3636+
if (strcmp(event_name, "start") == 0) {
3637+
Py_SETREF(target->start_event_obj, event_name_obj);
36393638
} else if (strcmp(event_name, "end") == 0) {
3640-
Py_INCREF(event_name_obj);
3641-
Py_XDECREF(target->end_event_obj);
3642-
target->end_event_obj = event_name_obj;
3639+
Py_SETREF(target->end_event_obj, event_name_obj);
36433640
} else if (strcmp(event_name, "start-ns") == 0) {
3644-
Py_INCREF(event_name_obj);
3645-
Py_XDECREF(target->start_ns_event_obj);
3646-
target->start_ns_event_obj = event_name_obj;
3641+
Py_SETREF(target->start_ns_event_obj, event_name_obj);
36473642
EXPAT(SetNamespaceDeclHandler)(
36483643
self->parser,
36493644
(XML_StartNamespaceDeclHandler) expat_start_ns_handler,
36503645
(XML_EndNamespaceDeclHandler) expat_end_ns_handler
36513646
);
36523647
} else if (strcmp(event_name, "end-ns") == 0) {
3653-
Py_INCREF(event_name_obj);
3654-
Py_XDECREF(target->end_ns_event_obj);
3655-
target->end_ns_event_obj = event_name_obj;
3648+
Py_SETREF(target->end_ns_event_obj, event_name_obj);
36563649
EXPAT(SetNamespaceDeclHandler)(
36573650
self->parser,
36583651
(XML_StartNamespaceDeclHandler) expat_start_ns_handler,
36593652
(XML_EndNamespaceDeclHandler) expat_end_ns_handler
36603653
);
36613654
} else {
3655+
Py_DECREF(event_name_obj);
36623656
Py_DECREF(events_seq);
36633657
PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name);
36643658
return NULL;

0 commit comments

Comments
 (0)