]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #18408: Fix _elementtree.c, don't call Python function from an expat
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 18 Jul 2013 20:46:14 +0000 (22:46 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 18 Jul 2013 20:46:14 +0000 (22:46 +0200)
handler if a Python exception is set

Modules/_elementtree.c

index 0f63077c185e760403a4eeea797b0944f613cd1b..acefd7bd2d9c1640e5b3dcd58fefdc0a4c284672 100644 (file)
@@ -2831,6 +2831,9 @@ expat_default_handler(XMLParserObject* self, const XML_Char* data_in,
     if (data_len < 2 || data_in[0] != '&')
         return;
 
+    if (PyErr_Occurred())
+        return;
+
     key = PyUnicode_DecodeUTF8(data_in + 1, data_len - 2, "strict");
     if (!key)
         return;
@@ -2871,6 +2874,9 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
     PyObject* attrib;
     int ok;
 
+    if (PyErr_Occurred())
+        return;
+
     /* tag name */
     tag = makeuniversal(self, tag_in);
     if (!tag)
@@ -2929,6 +2935,9 @@ expat_data_handler(XMLParserObject* self, const XML_Char* data_in,
     PyObject* data;
     PyObject* res;
 
+    if (PyErr_Occurred())
+        return;
+
     data = PyUnicode_DecodeUTF8(data_in, data_len, "strict");
     if (!data)
         return; /* parser will look for errors */
@@ -2952,6 +2961,9 @@ expat_end_handler(XMLParserObject* self, const XML_Char* tag_in)
     PyObject* tag;
     PyObject* res = NULL;
 
+    if (PyErr_Occurred())
+        return;
+
     if (TreeBuilder_CheckExact(self->target))
         /* shortcut */
         /* the standard tree builder doesn't look at the end tag */
@@ -2976,6 +2988,9 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
     PyObject* sprefix = NULL;
     PyObject* suri = NULL;
 
+    if (PyErr_Occurred())
+        return;
+
     suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict");
     if (!suri)
         return;
@@ -3000,6 +3015,9 @@ expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
 static void
 expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
 {
+    if (PyErr_Occurred())
+        return;
+
     treebuilder_handle_namespace(
         (TreeBuilderObject*) self->target, 0, NULL, NULL
         );
@@ -3011,6 +3029,9 @@ expat_comment_handler(XMLParserObject* self, const XML_Char* comment_in)
     PyObject* comment;
     PyObject* res;
 
+    if (PyErr_Occurred())
+        return;
+
     if (self->handle_comment) {
         comment = PyUnicode_DecodeUTF8(comment_in, strlen(comment_in), "strict");
         if (comment) {
@@ -3033,6 +3054,9 @@ expat_start_doctype_handler(XMLParserObject *self,
     PyObject *parser_doctype = NULL;
     PyObject *res = NULL;
 
+    if (PyErr_Occurred())
+        return;
+
     doctype_name_obj = makeuniversal(self, doctype_name);
     if (!doctype_name_obj)
         return;
@@ -3101,6 +3125,9 @@ expat_pi_handler(XMLParserObject* self, const XML_Char* target_in,
     PyObject* data;
     PyObject* res;
 
+    if (PyErr_Occurred())
+        return;
+
     if (self->handle_pi) {
         target = PyUnicode_DecodeUTF8(target_in, strlen(target_in), "strict");
         data = PyUnicode_DecodeUTF8(data_in, strlen(data_in), "strict");
@@ -3273,6 +3300,7 @@ expat_parse(XMLParserObject* self, const char* data, int data_len, int final)
 {
     int ok;
 
+    assert(!PyErr_Occurred());
     ok = EXPAT(Parse)(self->parser, data, data_len, final);
 
     if (PyErr_Occurred())