1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/json/json_reader.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <optional> 8*6777b538SAndroid Build Coastguard Worker #include <string_view> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/json/json_writer.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker // Entry point for LibFuzzer. LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)16*6777b538SAndroid Build Coastguard Workerextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 17*6777b538SAndroid Build Coastguard Worker if (size < 2) 18*6777b538SAndroid Build Coastguard Worker return 0; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // Create a copy of input buffer, as otherwise we don't catch 21*6777b538SAndroid Build Coastguard Worker // overflow that touches the last byte (which is used in options). 22*6777b538SAndroid Build Coastguard Worker std::unique_ptr<char[]> input(new char[size - 1]); 23*6777b538SAndroid Build Coastguard Worker memcpy(input.get(), data, size - 1); 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker std::string_view input_string(input.get(), size - 1); 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker const int options = data[size - 1]; 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker auto json_val = 30*6777b538SAndroid Build Coastguard Worker JSONReader::ReadAndReturnValueWithError(input_string, options); 31*6777b538SAndroid Build Coastguard Worker if (json_val.has_value()) { 32*6777b538SAndroid Build Coastguard Worker // Check that the value can be serialized and deserialized back to an 33*6777b538SAndroid Build Coastguard Worker // equivalent |Value|. 34*6777b538SAndroid Build Coastguard Worker const Value& value = *json_val; 35*6777b538SAndroid Build Coastguard Worker std::string serialized; 36*6777b538SAndroid Build Coastguard Worker CHECK(JSONWriter::Write(value, &serialized)); 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker std::optional<Value> deserialized = 39*6777b538SAndroid Build Coastguard Worker JSONReader::Read(std::string_view(serialized)); 40*6777b538SAndroid Build Coastguard Worker CHECK(deserialized); 41*6777b538SAndroid Build Coastguard Worker CHECK_EQ(value, deserialized.value()); 42*6777b538SAndroid Build Coastguard Worker } 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker return 0; 45*6777b538SAndroid Build Coastguard Worker } 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker } // namespace base 48