test-fuzz.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * Copyright (c) 2021, Ben Wiederhake <BenWiederhake.GitHub@gmx.de>
  3. * Copyright (c) 2023, Tim Schumacher <timschumi@gmx.de>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibCore/ArgsParser.h>
  8. #include <LibCore/File.h>
  9. #include <LibMain/Main.h>
  10. #include <unistd.h>
  11. // TODO: Look into generating this from the authoritative list of fuzzing targets in fuzzer.cmake.
  12. #define ENUMERATE_TARGETS(T) \
  13. T(ASN1) \
  14. T(Base64Roundtrip) \
  15. T(BLAKE2b) \
  16. T(BMPLoader) \
  17. T(Brotli) \
  18. T(CSSParser) \
  19. T(DDSLoader) \
  20. T(DNSPacket) \
  21. T(DeflateCompression) \
  22. T(DeflateDecompression) \
  23. T(ELF) \
  24. T(FlacLoader) \
  25. T(Gemini) \
  26. T(GIFLoader) \
  27. T(GzipDecompression) \
  28. T(GzipRoundtrip) \
  29. T(HttpRequest) \
  30. T(ICCProfile) \
  31. T(ICOLoader) \
  32. T(ILBMLoader) \
  33. T(IMAPParser) \
  34. T(JPEGLoader) \
  35. T(Js) \
  36. T(JsonParser) \
  37. T(LzmaDecompression) \
  38. T(LzmaRoundtrip) \
  39. T(Markdown) \
  40. T(MatroskaReader) \
  41. T(MD5) \
  42. T(MP3Loader) \
  43. T(PBMLoader) \
  44. T(PDF) \
  45. T(PEM) \
  46. T(PGMLoader) \
  47. T(PNGLoader) \
  48. T(Poly1305) \
  49. T(PPMLoader) \
  50. T(QOALoader) \
  51. T(QOILoader) \
  52. T(QuotedPrintableParser) \
  53. T(RegexECMA262) \
  54. T(RegexPosixBasic) \
  55. T(RegexPosixExtended) \
  56. T(RSAKeyParsing) \
  57. T(SHA1) \
  58. T(SHA256) \
  59. T(SHA384) \
  60. T(SHA512) \
  61. T(Shell) \
  62. T(ShellPosix) \
  63. T(SQLParser) \
  64. T(Tar) \
  65. T(TextDecoder) \
  66. T(TGALoader) \
  67. T(TIFFLoader) \
  68. T(TTF) \
  69. T(TinyVGLoader) \
  70. T(URL) \
  71. T(VP9Decoder) \
  72. T(WasmParser) \
  73. T(WAVLoader) \
  74. T(WebPLoader) \
  75. T(WOFF) \
  76. T(WOFF2) \
  77. T(XML) \
  78. T(Zip) \
  79. T(ZlibDecompression)
  80. #undef __ENUMERATE_TARGET
  81. #define __ENUMERATE_TARGET(x) extern "C" int Test##x(uint8_t const*, size_t);
  82. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  83. #undef __ENUMERATE_TARGET
  84. static auto parse_target_name(StringView name)
  85. {
  86. if (name == "list"sv) {
  87. outln("The following targets are included:");
  88. #undef __ENUMERATE_TARGET
  89. #define __ENUMERATE_TARGET(x) outln(#x);
  90. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  91. #undef __ENUMERATE_TARGET
  92. exit(0);
  93. }
  94. #undef __ENUMERATE_TARGET
  95. #define __ENUMERATE_TARGET(x) \
  96. if (name == #x) \
  97. return Test##x;
  98. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  99. #undef __ENUMERATE_TARGET
  100. warnln("Unknown fuzzing target \"{}\". Try \"list\" to get a full list.", name);
  101. exit(1);
  102. }
  103. ErrorOr<int> serenity_main(Main::Arguments arguments)
  104. {
  105. StringView type;
  106. StringView filename;
  107. Core::ArgsParser args_parser;
  108. args_parser.add_positional_argument(type, "Type of fuzzing target to run (use \"list\" to list all existing)", "target-kind");
  109. args_parser.add_positional_argument(filename, "Input file", "filename", Core::ArgsParser::Required::No);
  110. args_parser.parse(arguments);
  111. if (arguments.strings.size() <= 2 && arguments.strings[1] != "list"sv) {
  112. args_parser.print_usage_terminal(stderr, arguments.strings[0]);
  113. return 0;
  114. }
  115. auto fn = parse_target_name(type);
  116. auto file = TRY(Core::File::open(filename, Core::File::OpenMode::Read));
  117. auto input = TRY(file->read_until_eof());
  118. return fn(input.data(), input.size());
  119. }