Skip to content

Commit bf2bf03

Browse files
committed
Add fuzzer for expat module
1 parent 71ede86 commit bf2bf03

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
all : fuzzer-html fuzzer-email fuzzer-httpclient fuzzer-json fuzzer-difflib fuzzer-csv fuzzer-decode fuzzer-ast fuzzer-tarfile fuzzer-tarfile-hypothesis fuzzer-zipfile fuzzer-zipfile-hypothesis fuzzer-re fuzzer-configparser fuzzer-tomllib fuzzer-plistlib fuzzer-xml fuzzer-zoneinfo
1+
all : fuzzer-html fuzzer-email fuzzer-httpclient fuzzer-json fuzzer-difflib fuzzer-csv fuzzer-decode fuzzer-ast fuzzer-tarfile fuzzer-tarfile-hypothesis fuzzer-zipfile fuzzer-zipfile-hypothesis fuzzer-re fuzzer-configparser fuzzer-tomllib fuzzer-plistlib fuzzer-xml fuzzer-zoneinfo fuzzer-expat
22

33
PYTHON_CONFIG_PATH=$(CPYTHON_INSTALL_PATH)/bin/python3-config
44
CXXFLAGS += $(shell $(PYTHON_CONFIG_PATH) --cflags)
5-
LDFLAGS += -rdynamic $(shell $(PYTHON_CONFIG_PATH) --ldflags --embed)
5+
LDFLAGS += -rdynamic $(shell $(PYTHON_CONFIG_PATH) --ldflags --embed) $(CPYTHON_MODLIBS) -Wl,--allow-multiple-definition
66

77
fuzzer-html:
88
clang++ $(CXXFLAGS) $(LIB_FUZZING_ENGINE) -std=c++17 fuzzer.cpp -DPYTHON_HARNESS_PATH="\"html.py\"" -ldl $(LDFLAGS) -o fuzzer-html
@@ -40,3 +40,6 @@ fuzzer-xml:
4040
clang++ $(CXXFLAGS) $(LIB_FUZZING_ENGINE) -std=c++17 fuzzer.cpp -DPYTHON_HARNESS_PATH="\"xml.py\"" -ldl $(LDFLAGS) -o fuzzer-xml
4141
fuzzer-zoneinfo:
4242
clang++ $(CXXFLAGS) $(LIB_FUZZING_ENGINE) -std=c++17 fuzzer.cpp -DPYTHON_HARNESS_PATH="\"zoneinfo.py\"" -ldl $(LDFLAGS) -o fuzzer-zoneinfo
43+
44+
fuzzer-expat:
45+
clang++ $(CXXFLAGS) $(LIB_FUZZING_ENGINE) -std=c++17 fuzzer.cpp -DPYTHON_HARNESS_PATH="\"expat.py\"" -ldl $(LDFLAGS) -o fuzzer-expat

expat.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
# Fuzzes the expat XML parser (Modules/expat/xmlparse.c, Modules/pyexpat.c).
8+
# Creates a parser with a fuzzed encoding selection (None, UTF-8,
9+
# ISO-8859-1), installs handlers for elements, character data, PIs,
10+
# comments, and CDATA sections, then parses fuzzed bytes via Parse()
11+
# or ParseFile().
12+
def FuzzerRunOne(FuzzerInput):
13+
if len(FuzzerInput) < 1 or len(FuzzerInput) > 0x10000:
14+
return
15+
fdp = FuzzedDataProvider(FuzzerInput)
16+
use_parse_file = fdp.ConsumeBool()
17+
encoding = fdp.PickValueInList(ENCODINGS)
18+
try:
19+
p = expat.ParserCreate(encoding)
20+
p.StartElementHandler = lambda name, attrs: None
21+
p.EndElementHandler = lambda name: None
22+
p.CharacterDataHandler = lambda data: None
23+
p.ProcessingInstructionHandler = lambda target, data: None
24+
p.CommentHandler = lambda data: None
25+
p.StartCdataSectionHandler = lambda: None
26+
p.EndCdataSectionHandler = lambda: None
27+
p.DefaultHandler = lambda data: None
28+
29+
data = fdp.ConsumeBytes(fdp.remaining_bytes())
30+
if use_parse_file:
31+
p.ParseFile(io.BytesIO(data))
32+
else:
33+
p.Parse(data, True)
34+
except expat.ExpatError:
35+
pass
36+
except Exception:
37+
pass

fuzz_targets.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ csv csv.py
44
decode decode.py
55
difflib difflib.py
66
email email.py
7+
expat expat.py
78
html html.py
89
httpclient httpclient.py
910
json json.py

0 commit comments

Comments
 (0)