Skip to content

Commit 1695f72

Browse files
committed
Add fuzzer for dbm module
1 parent 71ede86 commit 1695f72

3 files changed

Lines changed: 57 additions & 2 deletions

File tree

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-dbm
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-dbm:
45+
clang++ $(CXXFLAGS) $(LIB_FUZZING_ENGINE) -std=c++17 fuzzer.cpp -DPYTHON_HARNESS_PATH="\"dbm.py\"" -ldl $(LDFLAGS) -o fuzzer-dbm

dbm.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from fuzzeddataprovider import FuzzedDataProvider
2+
import os
3+
import dbm
4+
import tempfile
5+
6+
OP_STORE = 0
7+
OP_GET = 1
8+
OP_LIST_KEYS = 2
9+
OP_DELETE = 3
10+
OP_ITERATE = 4
11+
12+
# Fuzzes the _gdbm C module (Modules/_gdbmmodule.c).
13+
# Exercises key-value store operations on a temporary GDBM database:
14+
# store, get, key listing, deletion, and iteration with fuzzed
15+
# keys and values.
16+
def FuzzerRunOne(FuzzerInput):
17+
if len(FuzzerInput) < 1 or len(FuzzerInput) > 0x10000:
18+
return
19+
fdp = FuzzedDataProvider(FuzzerInput)
20+
try:
21+
with tempfile.TemporaryDirectory() as tmpdir:
22+
dbpath = os.path.join(tmpdir, 'fuzzdb')
23+
with dbm.open(dbpath, 'c') as db:
24+
num_ops = fdp.ConsumeIntInRange(1, 20)
25+
for _ in range(num_ops):
26+
if fdp.remaining_bytes() == 0:
27+
break
28+
op = fdp.ConsumeIntInRange(OP_STORE, OP_ITERATE)
29+
if op == OP_STORE:
30+
n = fdp.ConsumeIntInRange(1, min(fdp.remaining_bytes(), 100))
31+
key = fdp.ConsumeBytes(n)
32+
n2 = fdp.ConsumeIntInRange(1, min(fdp.remaining_bytes(), 1000)) if fdp.remaining_bytes() > 0 else 0
33+
val = fdp.ConsumeBytes(n2) if n2 > 0 else b''
34+
db[key] = val
35+
elif op == OP_GET:
36+
n = fdp.ConsumeIntInRange(1, min(fdp.remaining_bytes(), 100))
37+
key = fdp.ConsumeBytes(n)
38+
_ = db.get(key)
39+
elif op == OP_LIST_KEYS:
40+
_ = list(db.keys())
41+
elif op == OP_DELETE:
42+
n = fdp.ConsumeIntInRange(1, min(fdp.remaining_bytes(), 100))
43+
key = fdp.ConsumeBytes(n)
44+
if key in db:
45+
del db[key]
46+
elif op == OP_ITERATE:
47+
for k in db:
48+
_ = db[k]
49+
break
50+
except Exception:
51+
pass

fuzz_targets.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
ast ast.py
22
configparser configparser.py
33
csv csv.py
4+
dbm dbm.py
45
decode decode.py
56
difflib difflib.py
67
email email.py

0 commit comments

Comments
 (0)