| // 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; | |
| } |