aboutsummaryrefslogtreecommitdiff
path: root/src/test_lib_json/fuzz.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_lib_json/fuzz.cpp')
-rw-r--r--src/test_lib_json/fuzz.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test_lib_json/fuzz.cpp b/src/test_lib_json/fuzz.cpp
new file mode 100644
index 0000000..5b75c22
--- /dev/null
+++ b/src/test_lib_json/fuzz.cpp
@@ -0,0 +1,54 @@
+// 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;
+}