Commit ea8c4315 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #24103: Fixed possible use after free in ElementTree.XMLPullParser.

parents f0069403 bc4ded95
...@@ -118,6 +118,8 @@ Core and Builtins ...@@ -118,6 +118,8 @@ Core and Builtins
Library Library
------- -------
- Issue #24103: Fixed possible use after free in ElementTree.XMLPullParser.
- Issue #25860: os.fwalk() no longer skips remaining directories when error - Issue #25860: os.fwalk() no longer skips remaining directories when error
occurs. Original patch by Samson Lee. occurs. Original patch by Samson Lee.
......
...@@ -3581,7 +3581,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, ...@@ -3581,7 +3581,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
/*[clinic end generated code: output=1440092922b13ed1 input=abf90830a1c3b0fc]*/ /*[clinic end generated code: output=1440092922b13ed1 input=abf90830a1c3b0fc]*/
{ {
/* activate element event reporting */ /* activate element event reporting */
Py_ssize_t i, seqlen; Py_ssize_t i;
TreeBuilderObject *target; TreeBuilderObject *target;
PyObject *events_append, *events_seq; PyObject *events_append, *events_seq;
...@@ -3599,8 +3599,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, ...@@ -3599,8 +3599,7 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
events_append = PyObject_GetAttrString(events_queue, "append"); events_append = PyObject_GetAttrString(events_queue, "append");
if (events_append == NULL) if (events_append == NULL)
return NULL; return NULL;
Py_XDECREF(target->events_append); Py_SETREF(target->events_append, events_append);
target->events_append = events_append;
/* clear out existing events */ /* clear out existing events */
Py_CLEAR(target->start_event_obj); Py_CLEAR(target->start_event_obj);
...@@ -3619,46 +3618,41 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self, ...@@ -3619,46 +3618,41 @@ _elementtree_XMLParser__setevents_impl(XMLParserObject *self,
return NULL; return NULL;
} }
seqlen = PySequence_Size(events_seq); for (i = 0; i < PySequence_Size(events_seq); ++i) {
for (i = 0; i < seqlen; ++i) {
PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i); PyObject *event_name_obj = PySequence_Fast_GET_ITEM(events_seq, i);
char *event_name = NULL; char *event_name = NULL;
if (PyUnicode_Check(event_name_obj)) { if (PyUnicode_Check(event_name_obj)) {
event_name = _PyUnicode_AsString(event_name_obj); event_name = PyUnicode_AsUTF8(event_name_obj);
} else if (PyBytes_Check(event_name_obj)) { } else if (PyBytes_Check(event_name_obj)) {
event_name = PyBytes_AS_STRING(event_name_obj); event_name = PyBytes_AS_STRING(event_name_obj);
} }
if (event_name == NULL) { if (event_name == NULL) {
Py_DECREF(events_seq); Py_DECREF(events_seq);
PyErr_Format(PyExc_ValueError, "invalid events sequence"); PyErr_Format(PyExc_ValueError, "invalid events sequence");
return NULL; return NULL;
} else if (strcmp(event_name, "start") == 0) { }
Py_INCREF(event_name_obj);
target->start_event_obj = event_name_obj; Py_INCREF(event_name_obj);
if (strcmp(event_name, "start") == 0) {
Py_SETREF(target->start_event_obj, event_name_obj);
} else if (strcmp(event_name, "end") == 0) { } else if (strcmp(event_name, "end") == 0) {
Py_INCREF(event_name_obj); Py_SETREF(target->end_event_obj, event_name_obj);
Py_XDECREF(target->end_event_obj);
target->end_event_obj = event_name_obj;
} else if (strcmp(event_name, "start-ns") == 0) { } else if (strcmp(event_name, "start-ns") == 0) {
Py_INCREF(event_name_obj); Py_SETREF(target->start_ns_event_obj, event_name_obj);
Py_XDECREF(target->start_ns_event_obj);
target->start_ns_event_obj = event_name_obj;
EXPAT(SetNamespaceDeclHandler)( EXPAT(SetNamespaceDeclHandler)(
self->parser, self->parser,
(XML_StartNamespaceDeclHandler) expat_start_ns_handler, (XML_StartNamespaceDeclHandler) expat_start_ns_handler,
(XML_EndNamespaceDeclHandler) expat_end_ns_handler (XML_EndNamespaceDeclHandler) expat_end_ns_handler
); );
} else if (strcmp(event_name, "end-ns") == 0) { } else if (strcmp(event_name, "end-ns") == 0) {
Py_INCREF(event_name_obj); Py_SETREF(target->end_ns_event_obj, event_name_obj);
Py_XDECREF(target->end_ns_event_obj);
target->end_ns_event_obj = event_name_obj;
EXPAT(SetNamespaceDeclHandler)( EXPAT(SetNamespaceDeclHandler)(
self->parser, self->parser,
(XML_StartNamespaceDeclHandler) expat_start_ns_handler, (XML_StartNamespaceDeclHandler) expat_start_ns_handler,
(XML_EndNamespaceDeclHandler) expat_end_ns_handler (XML_EndNamespaceDeclHandler) expat_end_ns_handler
); );
} else { } else {
Py_DECREF(event_name_obj);
Py_DECREF(events_seq); Py_DECREF(events_seq);
PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name); PyErr_Format(PyExc_ValueError, "unknown event '%s'", event_name);
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment