plistlib leaks ExpatError/LookupError instead of InvalidFileException for malformed XML
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug description:
plistlib.load()/loads() is documented to raise plistlib.InvalidFileException when a file cannot be parsed:
The parser raises
InvalidFileExceptionwhen the file cannot be parsed.
For the XML format, _PlistParser.parse() calls expat's ParserCreate().ParseFile() with no exception translation at all. Two classes of malformed input escape as the underlying exception instead, and neither is a ValueError (InvalidFileException's base class), so code that follows the documented contract and catches InvalidFileException (or even just ValueError) does not catch these:
- XML that is not well-formed raises a raw
xml.parsers.expat.ExpatError. - An
<?xml ... ?>declaration naming an encoding Python's codec registry doesn't know raises a rawLookupError. This is what CIFuzz found in gh-152211 (LookupError: unknown encoding: Latin-5_________________________); the well-formedness case above is a second, broader instance of the same missing-translation bug.
>>> import plistlib
>>> plistlib.loads(b"<plist><foo></bar></plist>")
Traceback (most recent call last):
...
xml.parsers.expat.ExpatError: mismatched tag: line 1, column 14
>>> plistlib.loads(b'<?xml version="1.0" encoding="BogusEncoding"?><plist></plist>')
Traceback (most recent call last):
...
LookupError: unknown encoding: BogusEncoding
Expected in both cases: plistlib.InvalidFileException, as already happens for other malformed inputs (e.g. plistlib.loads(b"not a plist") correctly raises InvalidFileException).
Related: gh-152211 (the CIFuzz report for the LookupError case specifically; discussion there is about the fuzz-target/CI setup, not a fix to plistlib itself).
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-155398
- gh-156177
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne bei plistlib._PlistParser.parse, das von plistlib.load() und loads() aufgerufen wird und die beiden fehlerhaften XML-Beispiele aus dem Issue lädt. Bestätige, dass fehlerhaftes XML und unbekannte Encodings in plistlib.InvalidFileException übersetzt werden, und überprüfe anschließend, dass das bestehende Verhalten bei fehlerhaften Eingaben intakt bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 25/100