libarchive_fuzzer.cc 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <stddef.h>
  2. #include <stdint.h>
  3. #include <vector>
  4. #include "archive.h"
  5. struct Buffer {
  6. const uint8_t *buf;
  7. size_t len;
  8. };
  9. ssize_t reader_callback(struct archive *a, void *client_data,
  10. const void **block) {
  11. Buffer *buffer = reinterpret_cast<Buffer *>(client_data);
  12. *block = buffer->buf;
  13. ssize_t len = buffer->len;
  14. buffer->len = 0;
  15. return len;
  16. }
  17. extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
  18. int ret;
  19. ssize_t r;
  20. struct archive *a = archive_read_new();
  21. archive_read_support_filter_all(a);
  22. archive_read_support_format_all(a);
  23. Buffer buffer = {buf, len};
  24. archive_read_open(a, &buffer, NULL, reader_callback, NULL);
  25. std::vector<uint8_t> data_buffer(getpagesize(), 0);
  26. struct archive_entry *entry;
  27. while(1) {
  28. ret = archive_read_next_header(a, &entry);
  29. if (ret == ARCHIVE_EOF || ret == ARCHIVE_FATAL)
  30. break;
  31. if (ret == ARCHIVE_RETRY)
  32. continue;
  33. while ((r = archive_read_data(a, data_buffer.data(),
  34. data_buffer.size())) > 0)
  35. ;
  36. if (r == ARCHIVE_FATAL)
  37. break;
  38. }
  39. archive_read_free(a);
  40. return 0;
  41. }