test-fuzz.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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(BMPLoader) \
  15. T(Brotli) \
  16. T(CSSParser) \
  17. T(CyrillicDecoder) \
  18. T(DDSLoader) \
  19. T(DeflateCompression) \
  20. T(DeflateDecompression) \
  21. T(ELF) \
  22. T(FlacLoader) \
  23. T(Gemini) \
  24. T(GIFLoader) \
  25. T(GzipCompression) \
  26. T(GzipDecompression) \
  27. T(HebrewDecoder) \
  28. T(HttpRequest) \
  29. T(ICCProfile) \
  30. T(ICOLoader) \
  31. T(ILBMLoader) \
  32. T(IMAPParser) \
  33. T(JPEGLoader) \
  34. T(Js) \
  35. T(Latin1Decoder) \
  36. T(Latin2Decoder) \
  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(TGALoader) \
  66. T(TTF) \
  67. T(TinyVGLoader) \
  68. T(URL) \
  69. T(UTF16BEDecoder) \
  70. T(VP9Decoder) \
  71. T(WasmParser) \
  72. T(WAVLoader) \
  73. T(WebPLoader) \
  74. T(WOFF) \
  75. T(XML) \
  76. T(Zip) \
  77. T(ZlibDecompression)
  78. #undef __ENUMERATE_TARGET
  79. #define __ENUMERATE_TARGET(x) extern "C" int Test##x(uint8_t const*, size_t);
  80. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  81. #undef __ENUMERATE_TARGET
  82. static auto parse_target_name(StringView name)
  83. {
  84. if (name == "list"sv) {
  85. outln("The following targets are included:");
  86. #undef __ENUMERATE_TARGET
  87. #define __ENUMERATE_TARGET(x) outln(#x);
  88. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  89. #undef __ENUMERATE_TARGET
  90. exit(0);
  91. }
  92. #undef __ENUMERATE_TARGET
  93. #define __ENUMERATE_TARGET(x) \
  94. if (name == #x) \
  95. return Test##x;
  96. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  97. #undef __ENUMERATE_TARGET
  98. warnln("Unknown fuzzing target \"{}\". Try \"list\" to get a full list.", name);
  99. exit(1);
  100. }
  101. ErrorOr<int> serenity_main(Main::Arguments arguments)
  102. {
  103. StringView type;
  104. StringView filename;
  105. Core::ArgsParser args_parser;
  106. args_parser.add_positional_argument(type, "Type of fuzzing target to run (use \"list\" to list all existing)", "target-kind");
  107. args_parser.add_positional_argument(filename, "Input file", "filename", Core::ArgsParser::Required::No);
  108. args_parser.parse(arguments);
  109. if (arguments.strings.size() <= 2 && arguments.strings[1] != "list"sv) {
  110. args_parser.print_usage_terminal(stderr, arguments.strings[0]);
  111. return 0;
  112. }
  113. auto fn = parse_target_name(type);
  114. auto file = TRY(Core::File::open(filename, Core::File::OpenMode::Read));
  115. auto input = TRY(file->read_until_eof());
  116. return fn(input.data(), input.size());
  117. }