c56bef871b
Sync docs with Docusaurus / sync (push) Waiting to run
Tests / Check if changed (push) Waiting to run
Tests / format (push) Blocked by required conditions
Tests / check-imports (push) Blocked by required conditions
Tests / Unit / macos-latest (push) Blocked by required conditions
Tests / Unit / ubuntu-latest (push) Blocked by required conditions
Tests / Unit / windows-latest (push) Blocked by required conditions
Tests / mypy (push) Blocked by required conditions
Tests / Integration / ubuntu-latest (push) Blocked by required conditions
Tests / Integration / macos-latest (push) Blocked by required conditions
Tests / Integration / windows-latest (push) Blocked by required conditions
Tests / notify-slack-on-failure (push) Blocked by required conditions
Tests / Mark tests as completed (push) Blocked by required conditions
Docker image release / Build base image (push) Waiting to run
CodeQL / Analyze (python) (push) Has been cancelled
Update Platform Components Table / update (push) Has been cancelled
44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
# SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai>
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
"""Fuzz target for ``Document.from_dict`` — deserializing untrusted document dicts."""
|
|
|
|
import json
|
|
import sys
|
|
|
|
import atheris
|
|
|
|
with atheris.instrument_imports():
|
|
from haystack.dataclasses import Document
|
|
|
|
# Normal reactions to malformed input; anything else is a genuine finding.
|
|
_EXPECTED = (ValueError, TypeError, KeyError)
|
|
|
|
|
|
def TestOneInput(data: bytes) -> None:
|
|
"""Parse fuzzer bytes as a JSON object and feed it to ``Document.from_dict``."""
|
|
# ``json.loads`` accepts ``bytes`` directly, so the raw fuzzer input *is* the JSON
|
|
# text. This keeps the input domain identical to the seed corpus (see corpus/) and
|
|
# lets libFuzzer mutate JSON directly instead of through a FuzzedDataProvider.
|
|
try:
|
|
obj = json.loads(data)
|
|
except (ValueError, RecursionError, UnicodeDecodeError):
|
|
return
|
|
if not isinstance(obj, dict):
|
|
return
|
|
try:
|
|
Document.from_dict(obj)
|
|
except _EXPECTED:
|
|
pass
|
|
|
|
|
|
def main() -> None:
|
|
"""Set up and run the Atheris fuzzing loop."""
|
|
atheris.Setup(sys.argv, TestOneInput)
|
|
atheris.Fuzz()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|