Skip to content

XMLParser.__init__() leaking refs when called twice #148058

@maurycy

Description

@maurycy

Bug report

Bug description:

Similarly to gh-147998, found with @devdanzin's Claude Code toolkit.

The XMLParser constructor does not care about already created objects if called twice:

self->entity = PyDict_New();

self->names = PyDict_New();

self->parser = EXPAT(st, ParserCreate_MM)(encoding, &ExpatMemoryHandler, "}");

etc.

I think it exists since 52467b1

Reproduction

2026-04-03T21:46:41.206031691+0000 maurycy@weiss /home/maurycy/cpython (main) % cat 1.py 
import gc
import xml.etree.ElementTree as ET


for i in range(20_000):
    p = ET.XMLParser()
    del p
    if i % 1000 == 0:
        gc.collect()
2026-04-03T21:46:41.431691265+0000 maurycy@weiss /home/maurycy/cpython (main) % cat 2.py
import gc
import xml.etree.ElementTree as ET


for i in range(20_000):
    p = ET.XMLParser()
    p.__init__()
    del p
    if i % 1000 == 0:
        gc.collect()

Then:

2026-04-03T21:50:56.840438090+0000 maurycy@weiss /home/maurycy/cpython (main) % ./python.exe -X showrefcount 1.py                                    
[0 refs, 0 blocks]
2026-04-03T21:51:01.610978599+0000 maurycy@weiss /home/maurycy/cpython (main) % ./python.exe -X showrefcount 2.py 
[343430 refs, 302265 blocks]

CPython versions tested on:

CPython main branch

Operating systems tested on:

% cat /etc/debian_version 
13.4

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    pendingThe issue will be closed if no feedback is providedtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions