diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-12-06 21:55:05 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-12-06 21:55:05 (GMT) |
commit | f2fdfe1f8859db62e73323f918149f3936e5e0e9 (patch) | |
tree | 85ece2d253ad2fbb7b7f4d5a846cf4746ad97931 /Modules/_elementtree.c | |
parent | 59fb6342a4ffdc23e1269a418734f4fc0f984873 (diff) | |
parent | 7ff276fd2e6d77ed8300933573141fdfdb41033b (diff) | |
download | cpython-f2fdfe1f8859db62e73323f918149f3936e5e0e9.zip cpython-f2fdfe1f8859db62e73323f918149f3936e5e0e9.tar.gz cpython-f2fdfe1f8859db62e73323f918149f3936e5e0e9.tar.bz2 |
Issue25814: Propagate all errors from custom XML parser handlers
in ElementTree.iterparse().
Diffstat (limited to 'Modules/_elementtree.c')
-rw-r--r-- | Modules/_elementtree.c | 127 |
1 files changed, 39 insertions, 88 deletions
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index f03e136..9026585 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2450,6 +2450,23 @@ treebuilder_add_subelement(PyObject *element, PyObject *child) } } +LOCAL(int) +treebuilder_append_event(TreeBuilderObject *self, PyObject *action, + PyObject *node) +{ + if (action != NULL) { + PyObject *res = PyTuple_Pack(2, action, node); + if (res == NULL) + return -1; + if (PyList_Append(self->events, res) < 0) { + Py_DECREF(res); + return -1; + } + Py_DECREF(res); + } + return 0; +} + /* -------------------------------------------------------------------- */ /* handlers */ @@ -2517,16 +2534,8 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag, Py_INCREF(node); self->last = node; - if (self->start_event_obj) { - PyObject* res; - PyObject* action = self->start_event_obj; - res = PyTuple_Pack(2, action, node); - if (res) { - PyList_Append(self->events, res); - Py_DECREF(res); - } else - PyErr_Clear(); /* FIXME: propagate error */ - } + if (treebuilder_append_event(self, self->start_event_obj, node) < 0) + goto error; return node; @@ -2606,65 +2615,13 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag) self->last = self->this; self->this = item; - if (self->end_event_obj) { - PyObject* res; - PyObject* action = self->end_event_obj; - PyObject* node = (PyObject*) self->last; - res = PyTuple_Pack(2, action, node); - if (res) { - PyList_Append(self->events, res); - Py_DECREF(res); - } else - PyErr_Clear(); /* FIXME: propagate error */ - } + if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0) + return NULL; Py_INCREF(self->last); return (PyObject*) self->last; } -LOCAL(void) -treebuilder_handle_namespace(TreeBuilderObject* self, int start, - PyObject *prefix, PyObject *uri) -{ - PyObject* res; - PyObject* action; - PyObject* parcel; - - if (!self->events) - return; - - if (start) { - if (!self->start_ns_event_obj) - return; - action = self->start_ns_event_obj; - parcel = Py_BuildValue("OO", prefix, uri); - if (!parcel) - return; - Py_INCREF(action); - } else { - if (!self->end_ns_event_obj) - return; - action = self->end_ns_event_obj; - Py_INCREF(action); - parcel = Py_None; - Py_INCREF(parcel); - } - - res = PyTuple_New(2); - - if (res) { - PyTuple_SET_ITEM(res, 0, action); - PyTuple_SET_ITEM(res, 1, parcel); - PyList_Append(self->events, res); - Py_DECREF(res); - } - else { - Py_DECREF(action); - Py_DECREF(parcel); - PyErr_Clear(); /* FIXME: propagate error */ - } -} - /* -------------------------------------------------------------------- */ /* methods (in alphabetical order) */ @@ -3076,45 +3033,39 @@ static void expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix, const XML_Char *uri) { - PyObject* sprefix = NULL; - PyObject* suri = NULL; + TreeBuilderObject *target = (TreeBuilderObject*) self->target; + PyObject *parcel; if (PyErr_Occurred()) return; - if (uri) - suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict"); - else - suri = PyUnicode_FromString(""); - if (!suri) - return; - - if (prefix) - sprefix = PyUnicode_DecodeUTF8(prefix, strlen(prefix), "strict"); - else - sprefix = PyUnicode_FromString(""); - if (!sprefix) { - Py_DECREF(suri); + if (!target->events || !target->start_ns_event_obj) return; - } - treebuilder_handle_namespace( - (TreeBuilderObject*) self->target, 1, sprefix, suri - ); + if (!uri) + uri = ""; + if (!prefix) + prefix = ""; - Py_DECREF(sprefix); - Py_DECREF(suri); + parcel = Py_BuildValue("ss", prefix, uri); + if (!parcel) + return; + treebuilder_append_event(target, target->start_ns_event_obj, parcel); + Py_DECREF(parcel); } static void expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in) { + TreeBuilderObject *target = (TreeBuilderObject*) self->target; + if (PyErr_Occurred()) return; - treebuilder_handle_namespace( - (TreeBuilderObject*) self->target, 0, NULL, NULL - ); + if (!target->events) + return; + + treebuilder_append_event(target, target->end_ns_event_obj, Py_None); } static void |