12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import sys
- import os
- import tempfile
- import atheris
- with atheris.instrument_imports():
- # We instrument `test_utils` as well, so it doesn't block coverage analysis in Fuzz Introspector:
- from test_utils import EnhancedFuzzedDataProvider
- from dulwich.repo import (
- Repo,
- InvalidUserIdentity,
- )
- def TestOneInput(data):
- fdp = EnhancedFuzzedDataProvider(data)
- with tempfile.TemporaryDirectory() as temp_dir:
- repo = Repo.init(temp_dir)
- repo.set_description(fdp.ConsumeRandomBytes())
- repo.get_description()
- # Generate a minimal set of files based on fuzz data to minimize I/O operations.
- file_paths = [
- os.path.join(temp_dir, f"File{i}")
- for i in range(min(3, fdp.ConsumeIntInRange(1, 3)))
- ]
- for file_path in file_paths:
- with open(file_path, "wb") as f:
- f.write(fdp.ConsumeRandomBytes())
- try:
- repo.do_commit(
- message=fdp.ConsumeRandomBytes(),
- committer=fdp.ConsumeRandomBytes(),
- author=fdp.ConsumeRandomBytes(),
- commit_timestamp=fdp.ConsumeRandomInt(),
- commit_timezone=fdp.ConsumeRandomInt(),
- author_timestamp=fdp.ConsumeRandomInt(),
- author_timezone=fdp.ConsumeRandomInt(),
- )
- except InvalidUserIdentity:
- return -1
- for file_path in file_paths:
- with open(file_path, "wb") as f:
- f.write(fdp.ConsumeRandomBytes())
- repo.stage(file_paths)
- repo.do_commit(
- message=fdp.ConsumeRandomBytes(),
- )
- def main():
- atheris.Setup(sys.argv, TestOneInput)
- atheris.Fuzz()
- if __name__ == "__main__":
- main()
|