dns_record_fuzzer.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // Copyright 2015 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 <stddef.h>
  5. #include <stdint.h>
  6. #include <memory>
  7. #include <vector>
  8. #include <fuzzer/FuzzedDataProvider.h>
  9. #include "base/files/file_path.h"
  10. #include "base/logging.h"
  11. #include "base/time/time.h"
  12. #include "net/dns/dns_response.h"
  13. #include "net/dns/record_parsed.h"
  14. void InitLogging() {
  15. // For debugging, it may be helpful to enable verbose logging by setting the
  16. // minimum log level to (-LOG_FATAL).
  17. logging::SetMinLogLevel(logging::LOG_FATAL);
  18. logging::LoggingSettings settings;
  19. settings.logging_dest =
  20. logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
  21. settings.log_file_path = nullptr;
  22. logging::InitLogging(settings);
  23. }
  24. // Entry point for LibFuzzer.
  25. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  26. InitLogging();
  27. FuzzedDataProvider data_provider(data, size);
  28. size_t num_records = data_provider.ConsumeIntegral<size_t>();
  29. std::vector<uint8_t> packet = data_provider.ConsumeRemainingBytes<uint8_t>();
  30. net::DnsRecordParser parser(packet.data(), packet.size(), /*offset=*/0,
  31. num_records);
  32. if (!parser.IsValid()) {
  33. return 0;
  34. }
  35. base::Time time;
  36. std::unique_ptr<const net::RecordParsed> record_parsed;
  37. do {
  38. record_parsed = net::RecordParsed::CreateFrom(&parser, time);
  39. } while (record_parsed);
  40. net::DnsResourceRecord record;
  41. while (parser.ReadRecord(&record)) {
  42. }
  43. return 0;
  44. }