test-fuzz.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright (c) 2021, Ben Wiederhake <BenWiederhake.GitHub@gmx.de>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/String.h>
  7. #include <LibCore/ArgsParser.h>
  8. #include <LibCore/File.h>
  9. #include <stdio.h>
  10. #include <unistd.h>
  11. #define ENUMERATE_TARGETS(T) \
  12. T(BMPLoader) \
  13. T(ELF) \
  14. T(Gemini) \
  15. T(GIFLoader) \
  16. T(HttpRequest) \
  17. T(ICOLoader) \
  18. T(JPGLoader) \
  19. T(Js) \
  20. T(Markdown) \
  21. T(PBMLoader) \
  22. T(PGMLoader) \
  23. T(PNGLoader) \
  24. T(PPMLoader) \
  25. T(QOILoader) \
  26. T(RegexECMA262) \
  27. T(RegexPosixExtended) \
  28. T(Shell) \
  29. T(TTF) \
  30. T(URL)
  31. #undef __ENUMERATE_TARGET
  32. #define __ENUMERATE_TARGET(x) extern "C" int Test##x(const uint8_t*, size_t);
  33. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  34. #undef __ENUMERATE_TARGET
  35. #define LLVMFuzzerTestOneInput TestBMPLoader
  36. #include <Meta/Lagom/Fuzzers/FuzzBMPLoader.cpp>
  37. #undef LLVMFuzzerTestOneInput
  38. #define LLVMFuzzerTestOneInput TestELF
  39. #include <Meta/Lagom/Fuzzers/FuzzELF.cpp>
  40. #undef LLVMFuzzerTestOneInput
  41. #define LLVMFuzzerTestOneInput TestGemini
  42. #include <Meta/Lagom/Fuzzers/FuzzGemini.cpp>
  43. #undef LLVMFuzzerTestOneInput
  44. #define LLVMFuzzerTestOneInput TestGIFLoader
  45. #include <Meta/Lagom/Fuzzers/FuzzGIFLoader.cpp>
  46. #undef LLVMFuzzerTestOneInput
  47. #define LLVMFuzzerTestOneInput TestHttpRequest
  48. #include <Meta/Lagom/Fuzzers/FuzzHttpRequest.cpp>
  49. #undef LLVMFuzzerTestOneInput
  50. #define LLVMFuzzerTestOneInput TestICOLoader
  51. #include <Meta/Lagom/Fuzzers/FuzzICOLoader.cpp>
  52. #undef LLVMFuzzerTestOneInput
  53. #define LLVMFuzzerTestOneInput TestJPGLoader
  54. #include <Meta/Lagom/Fuzzers/FuzzJPGLoader.cpp>
  55. #undef LLVMFuzzerTestOneInput
  56. #define LLVMFuzzerTestOneInput TestJs
  57. #include <Meta/Lagom/Fuzzers/FuzzJs.cpp>
  58. #undef LLVMFuzzerTestOneInput
  59. #define LLVMFuzzerTestOneInput TestMarkdown
  60. #include <Meta/Lagom/Fuzzers/FuzzMarkdown.cpp>
  61. #undef LLVMFuzzerTestOneInput
  62. #define LLVMFuzzerTestOneInput TestPBMLoader
  63. #include <Meta/Lagom/Fuzzers/FuzzPBMLoader.cpp>
  64. #undef LLVMFuzzerTestOneInput
  65. #define LLVMFuzzerTestOneInput TestPGMLoader
  66. #include <Meta/Lagom/Fuzzers/FuzzPGMLoader.cpp>
  67. #undef LLVMFuzzerTestOneInput
  68. #define LLVMFuzzerTestOneInput TestPNGLoader
  69. #include <Meta/Lagom/Fuzzers/FuzzPNGLoader.cpp>
  70. #undef LLVMFuzzerTestOneInput
  71. #define LLVMFuzzerTestOneInput TestPPMLoader
  72. #include <Meta/Lagom/Fuzzers/FuzzPPMLoader.cpp>
  73. #undef LLVMFuzzerTestOneInput
  74. #define LLVMFuzzerTestOneInput TestQOILoader
  75. #include <Meta/Lagom/Fuzzers/FuzzQOILoader.cpp>
  76. #undef LLVMFuzzerTestOneInput
  77. #define LLVMFuzzerTestOneInput TestRegexECMA262
  78. #include <Meta/Lagom/Fuzzers/FuzzRegexECMA262.cpp>
  79. #undef LLVMFuzzerTestOneInput
  80. #define LLVMFuzzerTestOneInput TestRegexPosixExtended
  81. #include <Meta/Lagom/Fuzzers/FuzzRegexPosixExtended.cpp>
  82. #undef LLVMFuzzerTestOneInput
  83. #define LLVMFuzzerTestOneInput TestShell
  84. #include <Meta/Lagom/Fuzzers/FuzzShell.cpp>
  85. #undef LLVMFuzzerTestOneInput
  86. #define LLVMFuzzerTestOneInput TestTTF
  87. #include <Meta/Lagom/Fuzzers/FuzzTTF.cpp>
  88. #undef LLVMFuzzerTestOneInput
  89. #define LLVMFuzzerTestOneInput TestURL
  90. #include <Meta/Lagom/Fuzzers/FuzzURL.cpp>
  91. #undef LLVMFuzzerTestOneInput
  92. static auto parse_target_name(const String& name)
  93. {
  94. if (name == "list") {
  95. outln("The following targets are included:");
  96. #undef __ENUMERATE_TARGET
  97. #define __ENUMERATE_TARGET(x) outln(#x);
  98. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  99. #undef __ENUMERATE_TARGET
  100. exit(0);
  101. }
  102. #undef __ENUMERATE_TARGET
  103. #define __ENUMERATE_TARGET(x) \
  104. if (name == #x) \
  105. return Test##x;
  106. ENUMERATE_TARGETS(__ENUMERATE_TARGET)
  107. #undef __ENUMERATE_TARGET
  108. warnln("Unknown fuzzing target \"{}\". Try \"list\" to get a full list.", name);
  109. exit(1);
  110. }
  111. int main(int argc, char** argv)
  112. {
  113. const char* type;
  114. const char* filename;
  115. Core::ArgsParser args_parser;
  116. args_parser.add_positional_argument(type, "Type of fuzzing target to run (use \"list\" to list all existing)", "target-kind");
  117. args_parser.add_positional_argument(filename, "Input file", "filename");
  118. args_parser.parse(argc, argv);
  119. auto fn = parse_target_name(type);
  120. auto file = Core::File::open(filename, Core::OpenMode::ReadOnly);
  121. if (file.is_error()) {
  122. warnln("Cannot read from file: {}", file.error());
  123. exit(1);
  124. }
  125. auto input = file.value()->read_all();
  126. return fn(input.data(), input.size());
  127. }