GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — mailbox.MH.get_sequences() unnecessarily materializes large sequence ranges · Issue #156379 · python/cpython Open Labels performancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-emailtype-featureA feature request or enhancementA feature request or enhancement DescriptionFeature or enhancementProposal:Hello Python Security Response Team, I am reporting a resource-exhaustion issue in CPython's mailbox.MH implementation. MH.get_sequences() materializes every integer in a range from the .mh_sequences metadata file before filtering the result against the message keys that actually exist. A normal MH.get_message() call invokes get_sequences(), so a tiny metadata file can cause a large allocation while loading an otherwise ordinary message. Please see the attached plain-text proof-of-concept, cpython-mh-sequence-repro.py. It creates a temporary MH mailbox containing one message and a small .mh_sequences file, then calls MH.get_message(1). On macOS with Python 3.14.6: Negative control: The latest main ASAN build also reproduced the behavior with a one-million range: 18 bytes of metadata reached approximately 223 MB maximum RSS while loading the single message. No ASAN diagnostic occurred; this report is not claiming a memory-safety issue. Root cause: In Lib/mailbox.py, MH.get_sequences() effectively executes keys.update(range(start, stop + 1)) and only afterwards filters the result against all_keys. The final result only contains existing mailbox keys, so the declared interval does not need to be enumerated. Suggested mitigation: Intersect each declared range with all_keys instead of enumerating the interval, for example: The fix should preserve existing malformed-input behavior, ordering, and empty-sequence removal, and should add a regression test using a very large range with a small mailbox. I searched the CPython issue and pull-request tracker for get_sequences, .mh_sequences, keys.update(range, and MH mailbox DoS. I did not find a matching report. Existing MH issues concerning Claws Mail sequence-file formats, missing .mh_sequences files, and replacement data loss are different behaviors. POC is here. #!/usr/bin/env python3 """Measure MH sequence-range materialization from a tiny mailbox file.""" from __future__ import annotations import argparse from pathlib import Path import mailbox import resource import sys import tempfile import time def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--stop", type=int, default=1_000_000) args = parser.parse_args() with tempfile.TemporaryDirectory(prefix="cpython-mh-") as tmp: root = Path(tmp) (root / "1").write_bytes(b"Subject: canary\n\nbody\n") (root / ".mh_sequences").write_text( f"unseen: 1-{args.stop}\n", encoding="ascii" ) box = mailbox.MH(root) start = time.monotonic() try: box.get_message(1) outcome = "message_loaded" except BaseException as exc: outcome = f"{type(exc).__name__}: {exc}" elapsed = time.monotonic() - start maxrss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss print(f"python={sys.version.split()[0]}") print(f"stop={args.stop} metadata_bytes={(root / '.mh_sequences').stat().st_size}") print(f"elapsed={elapsed:.3f}s maxrss={maxrss} outcome={outcome}") return 1 if args.stop >= 1_000_000 else 0 if __name__ == "__main__": raise SystemExit(main()) Has this already been discussed elsewhere?No response given Links to previous discussion of this feature:No response Linked PRsActivity
MetadataMetadataAssigneesLabelsperformancePerformance or resource usagePerformance or resource usagestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytopic-emailtype-featureA feature request or enhancementA feature request or enhancement ProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |