Skip to content

Commit 7efaf95

Browse files
Issue25814: Propagate all errors from custom XML parser handlers
in ElementTree.iterparse().
1 parent 6364094 commit 7efaf95

1 file changed

Lines changed: 39 additions & 88 deletions

File tree

Modules/_elementtree.c

Lines changed: 39 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,6 +2448,23 @@ treebuilder_add_subelement(PyObject *element, PyObject *child)
24482448
}
24492449
}
24502450

2451+
LOCAL(int)
2452+
treebuilder_append_event(TreeBuilderObject *self, PyObject *action,
2453+
PyObject *node)
2454+
{
2455+
if (action != NULL) {
2456+
PyObject *res = PyTuple_Pack(2, action, node);
2457+
if (res == NULL)
2458+
return -1;
2459+
if (PyList_Append(self->events, res) < 0) {
2460+
Py_DECREF(res);
2461+
return -1;
2462+
}
2463+
Py_DECREF(res);
2464+
}
2465+
return 0;
2466+
}
2467+
24512468
/* -------------------------------------------------------------------- */
24522469
/* handlers */
24532470

@@ -2515,16 +2532,8 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
25152532
Py_INCREF(node);
25162533
self->last = node;
25172534

2518-
if (self->start_event_obj) {
2519-
PyObject* res;
2520-
PyObject* action = self->start_event_obj;
2521-
res = PyTuple_Pack(2, action, node);
2522-
if (res) {
2523-
PyList_Append(self->events, res);
2524-
Py_DECREF(res);
2525-
} else
2526-
PyErr_Clear(); /* FIXME: propagate error */
2527-
}
2535+
if (treebuilder_append_event(self, self->start_event_obj, node) < 0)
2536+
goto error;
25282537

25292538
return node;
25302539

@@ -2604,65 +2613,13 @@ treebuilder_handle_end(TreeBuilderObject* self, PyObject* tag)
26042613
self->last = self->this;
26052614
self->this = item;
26062615

2607-
if (self->end_event_obj) {
2608-
PyObject* res;
2609-
PyObject* action = self->end_event_obj;
2610-
PyObject* node = (PyObject*) self->last;
2611-
res = PyTuple_Pack(2, action, node);
2612-
if (res) {
2613-
PyList_Append(self->events, res);
2614-
Py_DECREF(res);
2615-
} else
2616-
PyErr_Clear(); /* FIXME: propagate error */
2617-
}
2616+
if (treebuilder_append_event(self, self->end_event_obj, self->last) < 0)
2617+
return NULL;
26182618

26192619
Py_INCREF(self->last);
26202620
return (PyObject*) self->last;
26212621
}
26222622

2623-
LOCAL(void)
2624-
treebuilder_handle_namespace(TreeBuilderObject* self, int start,
2625-
PyObject *prefix, PyObject *uri)
2626-
{
2627-
PyObject* res;
2628-
PyObject* action;
2629-
PyObject* parcel;
2630-
2631-
if (!self->events)
2632-
return;
2633-
2634-
if (start) {
2635-
if (!self->start_ns_event_obj)
2636-
return;
2637-
action = self->start_ns_event_obj;
2638-
parcel = Py_BuildValue("OO", prefix, uri);
2639-
if (!parcel)
2640-
return;
2641-
Py_INCREF(action);
2642-
} else {
2643-
if (!self->end_ns_event_obj)
2644-
return;
2645-
action = self->end_ns_event_obj;
2646-
Py_INCREF(action);
2647-
parcel = Py_None;
2648-
Py_INCREF(parcel);
2649-
}
2650-
2651-
res = PyTuple_New(2);
2652-
2653-
if (res) {
2654-
PyTuple_SET_ITEM(res, 0, action);
2655-
PyTuple_SET_ITEM(res, 1, parcel);
2656-
PyList_Append(self->events, res);
2657-
Py_DECREF(res);
2658-
}
2659-
else {
2660-
Py_DECREF(action);
2661-
Py_DECREF(parcel);
2662-
PyErr_Clear(); /* FIXME: propagate error */
2663-
}
2664-
}
2665-
26662623
/* -------------------------------------------------------------------- */
26672624
/* methods (in alphabetical order) */
26682625

@@ -3100,45 +3057,39 @@ static void
31003057
expat_start_ns_handler(XMLParserObject* self, const XML_Char* prefix,
31013058
const XML_Char *uri)
31023059
{
3103-
PyObject* sprefix = NULL;
3104-
PyObject* suri = NULL;
3060+
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
3061+
PyObject *parcel;
31053062

31063063
if (PyErr_Occurred())
31073064
return;
31083065

3109-
if (uri)
3110-
suri = PyUnicode_DecodeUTF8(uri, strlen(uri), "strict");
3111-
else
3112-
suri = PyUnicode_FromString("");
3113-
if (!suri)
3114-
return;
3115-
3116-
if (prefix)
3117-
sprefix = PyUnicode_DecodeUTF8(prefix, strlen(prefix), "strict");
3118-
else
3119-
sprefix = PyUnicode_FromString("");
3120-
if (!sprefix) {
3121-
Py_DECREF(suri);
3066+
if (!target->events || !target->start_ns_event_obj)
31223067
return;
3123-
}
31243068

3125-
treebuilder_handle_namespace(
3126-
(TreeBuilderObject*) self->target, 1, sprefix, suri
3127-
);
3069+
if (!uri)
3070+
uri = "";
3071+
if (!prefix)
3072+
prefix = "";
31283073

3129-
Py_DECREF(sprefix);
3130-
Py_DECREF(suri);
3074+
parcel = Py_BuildValue("ss", prefix, uri);
3075+
if (!parcel)
3076+
return;
3077+
treebuilder_append_event(target, target->start_ns_event_obj, parcel);
3078+
Py_DECREF(parcel);
31313079
}
31323080

31333081
static void
31343082
expat_end_ns_handler(XMLParserObject* self, const XML_Char* prefix_in)
31353083
{
3084+
TreeBuilderObject *target = (TreeBuilderObject*) self->target;
3085+
31363086
if (PyErr_Occurred())
31373087
return;
31383088

3139-
treebuilder_handle_namespace(
3140-
(TreeBuilderObject*) self->target, 0, NULL, NULL
3141-
);
3089+
if (!target->events)
3090+
return;
3091+
3092+
treebuilder_append_event(target, target->end_ns_event_obj, Py_None);
31423093
}
31433094

31443095
static void

0 commit comments

Comments
 (0)