1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
import sys
from datetime import timedelta
from hypothesis import given, settings
from hypothesis import strategies as st
import pyppmd
if sys.maxsize > 2**32:
MAX_SIZE = 1 << 30
else:
MAX_SIZE = 1 << 28
@given(
txt=st.text(min_size=1),
max_order=st.integers(min_value=2, max_value=64),
mem_size=st.integers(min_value=1 << 11, max_value=MAX_SIZE),
)
@settings(deadline=timedelta(milliseconds=300))
def test_ppmd7_fuzzer(txt, max_order, mem_size):
obj = txt.encode("UTF-8")
enc = pyppmd.Ppmd7Encoder(max_order=max_order, mem_size=mem_size)
length = len(obj)
compressed = enc.encode(obj)
compressed += enc.flush()
dec = pyppmd.Ppmd7Decoder(max_order=max_order, mem_size=mem_size)
result = dec.decode(compressed, length)
if len(result) < length:
if dec.needs_input:
# ppmd need extra null byte
result += dec.decode(b"\0", length - len(result))
else:
result += dec.decode(b"", length - len(result))
assert result == obj
assert dec.eof
assert not dec.needs_input
@given(
txt=st.text(min_size=1),
max_order=st.integers(min_value=3, max_value=16),
mem_size=st.integers(min_value=1 << 11, max_value=MAX_SIZE),
)
@settings(deadline=timedelta(milliseconds=300))
def test_ppmd8_fuzzer(txt, max_order, mem_size):
obj = txt.encode("UTF-8")
enc = pyppmd.Ppmd8Encoder(max_order=max_order, mem_size=mem_size, restore_method=pyppmd.PPMD8_RESTORE_METHOD_CUT_OFF)
length = len(obj)
compressed = enc.encode(obj)
compressed += enc.flush()
dec = pyppmd.Ppmd8Decoder(max_order=max_order, mem_size=mem_size, restore_method=pyppmd.PPMD8_RESTORE_METHOD_CUT_OFF)
result = dec.decode(compressed, length)
if len(result) < length:
if dec.needs_input:
# ppmd need extra null byte
result += dec.decode(b"\0", length - len(result))
else:
result += dec.decode(b"", length - len(result))
assert result == obj
if __name__ == "__main__":
import atheris # type: ignore # noqa
atheris.Setup(sys.argv, test_ppmd7_fuzzer.hypothesis.fuzz_one_input)
atheris.Fuzz()
|