Skip to content

gh-132097: fix runtime UB when calling expat handlers #132265

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 12, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 21 additions & 14 deletions Modules/_elementtree.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -3082,8 +3082,7 @@ typedef struct {
PyObject *elementtree_module; PyObject *elementtree_module;
} XMLParserObject; } XMLParserObject;



#define XMLParserObject_CAST(op) ((XMLParserObject *)(op))
#define _XMLParser_CAST(op) ((XMLParserObject *)(op))


/* helpers */ /* helpers */


Expand Down Expand Up @@ -3207,9 +3206,9 @@ expat_set_error(elementtreestate *st, enum XML_Error error_code,
/* handlers */ /* handlers */


static void static void
expat_default_handler(XMLParserObject* self, const XML_Char* data_in, expat_default_handler(void *op, const XML_Char *data_in, int data_len)
int data_len)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *key; PyObject *key;
PyObject *value; PyObject *value;
PyObject *res; PyObject *res;
Expand Down Expand Up @@ -3254,9 +3253,10 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
} }


static void static void
expat_start_handler(XMLParserObject* self, const XML_Char* tag_in, expat_start_handler(void *op, const XML_Char *tag_in,
const XML_Char **attrib_in) const XML_Char **attrib_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *res; PyObject *res;
PyObject *tag; PyObject *tag;
PyObject *attrib; PyObject *attrib;
Expand Down Expand Up @@ -3331,9 +3331,10 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
} }


static void static void
expat_data_handler(XMLParserObject* self, const XML_Char* data_in, expat_data_handler(void *op, const XML_Char *data_in,
int data_len) int data_len)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *data; PyObject *data;
PyObject *res; PyObject *res;


Expand All @@ -3359,8 +3360,9 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
} }


static void static void
expat_end_handler(XMLParserObject* self, const XML_Char* tag_in) expat_end_handler(void *op, const XML_Char *tag_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *tag; PyObject *tag;
PyObject *res = NULL; PyObject *res = NULL;


Expand All @@ -3386,9 +3388,10 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
} }


static void static void
expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in, expat_start_ns_handler(void *op, const XML_Char *prefix_in,
const XML_Char *uri_in) const XML_Char *uri_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *res = NULL; PyObject *res = NULL;
PyObject *uri; PyObject *uri;
PyObject *prefix; PyObject *prefix;
Expand Down Expand Up @@ -3440,8 +3443,9 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix_in,
} }


static void static void
expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) expat_end_ns_handler(void *op, const XML_Char *prefix_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *res = NULL; PyObject *res = NULL;
PyObject *prefix; PyObject *prefix;


Expand Down Expand Up @@ -3472,8 +3476,9 @@ expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
} }


static void static void
expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in) expat_comment_handler(void *op, const XML_Char *comment_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *comment; PyObject *comment;
PyObject *res; PyObject *res;


Expand Down Expand Up @@ -3504,12 +3509,13 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
} }


static void static void
expat_start_doctype_handler(XMLParserObject *self, expat_start_doctype_handler(void *op,
const XML_Char *doctype_name, const XML_Char *doctype_name,
const XML_Char *sysid, const XML_Char *sysid,
const XML_Char *pubid, const XML_Char *pubid,
int has_internal_subset) int has_internal_subset)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *doctype_name_obj, *sysid_obj, *pubid_obj; PyObject *doctype_name_obj, *sysid_obj, *pubid_obj;
PyObject *res; PyObject *res;


Expand Down Expand Up @@ -3562,9 +3568,10 @@ expat_start_doctype_handler(XMLParserObject *self,
} }


static void static void
expat_pi_handler(XMLParserObject* self, const XML_Char* target_in, expat_pi_handler(void *op, const XML_Char *target_in,
const XML_Char *data_in) const XML_Char *data_in)
{ {
XMLParserObject *self = XMLParserObject_CAST(op);
PyObject *pi_target; PyObject *pi_target;
PyObject *data; PyObject *data;
PyObject *res; PyObject *res;
Expand Down Expand Up @@ -3777,7 +3784,7 @@ _elementtree_XMLParser___init___impl(XMLParserObject *self, PyObject *target,
static int static int
xmlparser_gc_traverse(PyObject *op, visitproc visit, void *arg) xmlparser_gc_traverse(PyObject *op, visitproc visit, void *arg)
{ {
XMLParserObject *self = _XMLParser_CAST(op); XMLParserObject *self = XMLParserObject_CAST(op);
Py_VISIT(Py_TYPE(self)); Py_VISIT(Py_TYPE(self));
Py_VISIT(self->handle_close); Py_VISIT(self->handle_close);
Py_VISIT(self->handle_pi); Py_VISIT(self->handle_pi);
Expand All @@ -3799,7 +3806,7 @@ xmlparser_gc_traverse(PyObject *op, visitproc visit, void *arg)
static int static int
xmlparser_gc_clear(PyObject *op) xmlparser_gc_clear(PyObject *op)
{ {
XMLParserObject *self = _XMLParser_CAST(op); XMLParserObject *self = XMLParserObject_CAST(op);
elementtreestate *st = self->state; elementtreestate *st = self->state;
if (self->parser != NULL) { if (self->parser != NULL) {
XML_Parser parser = self->parser; XML_Parser parser = self->parser;
Expand Down
Loading