| // Copyright 2007-2019 The JsonCpp Authors | 
 | // Distributed under MIT license, or public domain if desired and | 
 | // recognized in your jurisdiction. | 
 | // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE | 
 |  | 
 | #include "fuzz.h" | 
 |  | 
 | #include <cstdint> | 
 | #include <json/config.h> | 
 | #include <json/json.h> | 
 | #include <memory> | 
 | #include <string> | 
 |  | 
 | namespace Json { | 
 | class Exception; | 
 | } | 
 |  | 
 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 
 |   Json::CharReaderBuilder builder; | 
 |  | 
 |   if (size < sizeof(uint32_t)) { | 
 |     return 0; | 
 |   } | 
 |  | 
 |   const uint32_t hash_settings = static_cast<uint32_t>(data[0]) | | 
 |                                  (static_cast<uint32_t>(data[1]) << 8) | | 
 |                                  (static_cast<uint32_t>(data[2]) << 16) | | 
 |                                  (static_cast<uint32_t>(data[3]) << 24); | 
 |   data += sizeof(uint32_t); | 
 |   size -= sizeof(uint32_t); | 
 |  | 
 |   builder.settings_["failIfExtra"] = hash_settings & (1 << 0); | 
 |   builder.settings_["allowComments_"] = hash_settings & (1 << 1); | 
 |   builder.settings_["strictRoot_"] = hash_settings & (1 << 2); | 
 |   builder.settings_["allowDroppedNullPlaceholders_"] = hash_settings & (1 << 3); | 
 |   builder.settings_["allowNumericKeys_"] = hash_settings & (1 << 4); | 
 |   builder.settings_["allowSingleQuotes_"] = hash_settings & (1 << 5); | 
 |   builder.settings_["failIfExtra_"] = hash_settings & (1 << 6); | 
 |   builder.settings_["rejectDupKeys_"] = hash_settings & (1 << 7); | 
 |   builder.settings_["allowSpecialFloats_"] = hash_settings & (1 << 8); | 
 |   builder.settings_["collectComments"] = hash_settings & (1 << 9); | 
 |   builder.settings_["allowTrailingCommas_"] = hash_settings & (1 << 10); | 
 |  | 
 |   std::unique_ptr<Json::CharReader> reader(builder.newCharReader()); | 
 |  | 
 |   Json::Value root; | 
 |   const auto data_str = reinterpret_cast<const char*>(data); | 
 |   try { | 
 |     reader->parse(data_str, data_str + size, &root, nullptr); | 
 |   } catch (Json::Exception const&) { | 
 |   } | 
 |   // Whether it succeeded or not doesn't matter. | 
 |   return 0; | 
 | } |