Skip to content

Commit

Permalink
Merge pull request #1914 from DaveLak/add-diff-fuzz-target
Browse files Browse the repository at this point in the history
Add `Diff` Fuzz Target
  • Loading branch information
Byron committed May 9, 2024
2 parents a5815b6 + 989ae1a commit 4e212c6
Showing 1 changed file with 83 additions and 0 deletions.
83 changes: 83 additions & 0 deletions fuzzing/fuzz-targets/fuzz_diff.py
@@ -0,0 +1,83 @@
import sys
import os
import io
import tempfile
from binascii import Error as BinasciiError

import atheris

if getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS"):
path_to_bundled_git_binary = os.path.abspath(os.path.join(os.path.dirname(__file__), "git"))
os.environ["GIT_PYTHON_GIT_EXECUTABLE"] = path_to_bundled_git_binary

with atheris.instrument_imports():
from git import Repo, Diff


class BytesProcessAdapter:
"""Allows bytes to be used as process objects returned by subprocess.Popen."""

def __init__(self, input_string):
self.stdout = io.BytesIO(input_string)
self.stderr = io.BytesIO()

def wait(self):
return 0

poll = wait


def TestOneInput(data):
fdp = atheris.FuzzedDataProvider(data)

with tempfile.TemporaryDirectory() as temp_dir:
repo = Repo.init(path=temp_dir)
try:
diff = Diff(
repo,
a_rawpath=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
b_rawpath=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
a_blob_id=fdp.ConsumeBytes(20),
b_blob_id=fdp.ConsumeBytes(20),
a_mode=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
b_mode=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
new_file=fdp.ConsumeBool(),
deleted_file=fdp.ConsumeBool(),
copied_file=fdp.ConsumeBool(),
raw_rename_from=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
raw_rename_to=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
diff=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())),
change_type=fdp.PickValueInList(["A", "D", "C", "M", "R", "T", "U"]),
score=fdp.ConsumeIntInRange(0, fdp.remaining_bytes()),
)
except BinasciiError:
return -1
except AssertionError as e:
if "Require 20 byte binary sha, got" in str(e):
return -1
else:
raise e

_ = diff.__str__()
_ = diff.a_path
_ = diff.b_path
_ = diff.rename_from
_ = diff.rename_to
_ = diff.renamed_file

diff_index = diff._index_from_patch_format(
repo, proc=BytesProcessAdapter(fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())))
)

diff._handle_diff_line(
lines_bytes=fdp.ConsumeBytes(fdp.ConsumeIntInRange(0, fdp.remaining_bytes())), repo=repo, index=diff_index
)


def main():
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()


if __name__ == "__main__":
main()

0 comments on commit 4e212c6

Please sign in to comment.