uri_fuzzer.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <fuzzer/FuzzedDataProvider.h>
  5. #include <cstddef>
  6. #include <cstdint>
  7. #include "chromeos/printing/uri.h"
  8. namespace {
  9. std::vector<std::string> CreatePath(size_t size, FuzzedDataProvider* data) {
  10. std::vector<std::string> path(size);
  11. for (auto& segment : path)
  12. segment = data->ConsumeRandomLengthString();
  13. return path;
  14. }
  15. std::vector<std::pair<std::string, std::string>> CreateQuery(
  16. size_t size,
  17. FuzzedDataProvider* data) {
  18. std::vector<std::pair<std::string, std::string>> query(size);
  19. for (auto& name_value : query) {
  20. name_value.first = data->ConsumeRandomLengthString();
  21. name_value.second = data->ConsumeRandomLengthString();
  22. }
  23. return query;
  24. }
  25. } // namespace
  26. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  27. // Split fuzzer data into 1-byte mode and input string.
  28. FuzzedDataProvider fuzz_data(data, size);
  29. const uint8_t mode = fuzz_data.ConsumeIntegral<uint8_t>();
  30. const int method = mode % 16;
  31. const size_t param_size = mode / 16;
  32. // Call one of the parser method (selected by |method|).
  33. chromeos::Uri uri;
  34. switch (method) {
  35. case 0:
  36. case 1:
  37. uri = chromeos::Uri(fuzz_data.ConsumeRemainingBytesAsString());
  38. break;
  39. case 2:
  40. uri.SetScheme(fuzz_data.ConsumeRemainingBytesAsString());
  41. break;
  42. case 3:
  43. uri.SetPort(fuzz_data.ConsumeIntegral<uint16_t>());
  44. break;
  45. case 4:
  46. uri.SetUserinfo(fuzz_data.ConsumeRemainingBytesAsString());
  47. break;
  48. case 5:
  49. uri.SetHost(fuzz_data.ConsumeRemainingBytesAsString());
  50. break;
  51. case 6:
  52. uri.SetPath(CreatePath(param_size, &fuzz_data));
  53. break;
  54. case 7:
  55. uri.SetQuery(CreateQuery(param_size, &fuzz_data));
  56. break;
  57. case 8:
  58. uri.SetFragment(fuzz_data.ConsumeRemainingBytesAsString());
  59. break;
  60. case 9:
  61. uri.SetUserinfoEncoded(fuzz_data.ConsumeRemainingBytesAsString());
  62. break;
  63. case 10:
  64. uri.SetHostEncoded(fuzz_data.ConsumeRemainingBytesAsString());
  65. break;
  66. case 11:
  67. uri.SetPathEncoded(fuzz_data.ConsumeRemainingBytesAsString());
  68. break;
  69. case 12:
  70. uri.SetPathEncoded(CreatePath(param_size, &fuzz_data));
  71. break;
  72. case 13:
  73. uri.SetQueryEncoded(fuzz_data.ConsumeRemainingBytesAsString());
  74. break;
  75. case 14:
  76. uri.SetQueryEncoded(CreateQuery(param_size, &fuzz_data));
  77. break;
  78. case 15:
  79. uri.SetFragmentEncoded(fuzz_data.ConsumeRemainingBytesAsString());
  80. break;
  81. default:
  82. // it will never happen
  83. break;
  84. }
  85. // Call all Get methods.
  86. uri.GetLastParsingError();
  87. uri.GetNormalized(false);
  88. uri.GetNormalized(true);
  89. uri.IsASCII();
  90. uri.GetScheme();
  91. uri.GetPort();
  92. uri.GetUserinfo();
  93. uri.GetHost();
  94. uri.GetPath();
  95. uri.GetQuery();
  96. uri.GetFragment();
  97. uri.GetUserinfoEncoded();
  98. uri.GetHostEncoded();
  99. uri.GetPathEncoded();
  100. uri.GetPathEncodedAsString();
  101. uri.GetQueryEncoded();
  102. uri.GetQueryEncodedAsString();
  103. uri.GetFragmentEncoded();
  104. // Exit.
  105. return 0;
  106. }