Skip to content

[3.14] gh-90949: expose Expat API to tune exponential expansion protections (GH-139368)#150496

Draft
StanFromIreland wants to merge 1 commit into
python:3.14from
StanFromIreland:backport-6661123-3.14
Draft

[3.14] gh-90949: expose Expat API to tune exponential expansion protections (GH-139368)#150496
StanFromIreland wants to merge 1 commit into
python:3.14from
StanFromIreland:backport-6661123-3.14

Conversation

@StanFromIreland
Copy link
Copy Markdown
Member

@StanFromIreland StanFromIreland commented May 26, 2026

Expose the XML Expat 2.7.2 APIs to tune protections against "billion laughs" 1 attacks.

The exposed APIs are available on Expat parsers, that is, parsers created by xml.parsers.expat.ParserCreate(), as:

  • parser.SetBillionLaughsAttackProtectionActivationThreshold(threshold), and
  • parser.SetBillionLaughsAttackProtectionMaximumAmplification(max_factor).

This completes the work in f04bea4, and improves the existing related documentation.

… protections (pythonGH-139368)

Expose the XML Expat 2.7.2 APIs to tune protections against
"billion laughs" [1] attacks.

The exposed APIs are available on Expat parsers, that is,
parsers created by `xml.parsers.expat.ParserCreate()`, as:

- `parser.SetBillionLaughsAttackProtectionActivationThreshold(threshold)`, and
- `parser.SetBillionLaughsAttackProtectionMaximumAmplification(max_factor)`.

This completes the work in f04bea4,
and improves the existing related documentation.

[1]: https://en.wikipedia.org/wiki/Billion_laughs_attack
(cherry picked from commit 6661123)

Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Comment thread Lib/test/test_pyexpat.py
self.assert_root_parser_failure(setter, 123.45)


@unittest.skipIf(expat.version_info < (2, 4, 0), "requires Expat >= 2.4.0")
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we had a recent issue where this check was not sufficient and tests needed to be disabled in another way using hasattr() checks. Can you check how it's currently done on main please?

Comment thread Modules/pyexpat.c
Comment on lines +1261 to +1264
return set_activation_threshold(
self, cls, threshold,
XML_SetBillionLaughsAttackProtectionActivationThreshold
);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seem to be too many whitespaces here.

Comment thread Modules/pyexpat.c
Comment on lines +1298 to +1300
return set_maximum_amplification(
self, cls, max_factor,
XML_SetBillionLaughsAttackProtectionMaximumAmplification
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

@StanFromIreland StanFromIreland marked this pull request as draft May 26, 2026 21:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants