|
| 1 | +from fuzzeddataprovider import FuzzedDataProvider |
| 2 | +from xml.parsers import expat |
| 3 | +import io |
| 4 | + |
| 5 | +ENCODINGS = [None, "utf-8", "iso-8859-1"] |
| 6 | + |
| 7 | + |
| 8 | +# Fuzzes the expat XML parser (Modules/expat/xmlparse.c, Modules/pyexpat.c). |
| 9 | +# Creates a parser with a fuzzed encoding selection (None, UTF-8, |
| 10 | +# ISO-8859-1), installs handlers for elements, character data, PIs, |
| 11 | +# comments, and CDATA sections, then parses fuzzed bytes via Parse() |
| 12 | +# or ParseFile(). |
| 13 | +def FuzzerRunOne(FuzzerInput): |
| 14 | + if len(FuzzerInput) < 1 or len(FuzzerInput) > 0x10000: |
| 15 | + return |
| 16 | + fdp = FuzzedDataProvider(FuzzerInput) |
| 17 | + use_parse_file = fdp.ConsumeBool() |
| 18 | + encoding = fdp.PickValueInList(ENCODINGS) |
| 19 | + try: |
| 20 | + p = expat.ParserCreate(encoding) |
| 21 | + p.StartElementHandler = lambda name, attrs: None |
| 22 | + p.EndElementHandler = lambda name: None |
| 23 | + p.CharacterDataHandler = lambda data: None |
| 24 | + p.ProcessingInstructionHandler = lambda target, data: None |
| 25 | + p.CommentHandler = lambda data: None |
| 26 | + p.StartCdataSectionHandler = lambda: None |
| 27 | + p.EndCdataSectionHandler = lambda: None |
| 28 | + p.DefaultHandler = lambda data: None |
| 29 | + |
| 30 | + data = fdp.ConsumeBytes(fdp.remaining_bytes()) |
| 31 | + if use_parse_file: |
| 32 | + p.ParseFile(io.BytesIO(data)) |
| 33 | + else: |
| 34 | + p.Parse(data, True) |
| 35 | + except expat.ExpatError: |
| 36 | + pass |
| 37 | + except Exception: |
| 38 | + pass |
0 commit comments