Issue 17901: _elementtree.TreeBuilder raises IndexError on end if constructed with element_factory=None (original) (raw)

When the _elementtree module is in use, the TreeBuilder class will raise an IndexError in treebuilder_handle_end if init was passed "None".

I discovered this while writing a subclass of TreeBuilder with a modified init method that delegated to TreeBuilder:

class MyTreeBuilder(ET.TreeBuilder):
    def __init__(self, element_factory=None):
        super().__init__(element_factory)

Used as a target, this class (and also simply "TreeBuilder(None)") will cause the IndexError when "parser.feed(data)" is called.

import xml.etree.ElementTree as ET parser = ET.XMLParser(target=ET.TreeBuilder(None)) parser.feed('22') Traceback (most recent call last): File "", line 1, in IndexError: pop from empty stack

The error is raised from treebuilder_handle_end, but the cause appears to be in treebuilder_handle_start.

if (self->element_factory) {
    node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib);
} else {
    node = create_new_element(tag, attrib);
}

I included a patch adding a check against Py_None to the "if" test above which seems to fix the issue. I also included a simple test case for it.