1 // Copyright 2019 The Chromium OS 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 
5 #include "libipp/ipp.h"
6 
7 #include <cstdint>
8 #include <limits>
9 #include <vector>
10 
11 #include "base/test/fuzzed_data_provider.h"
12 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)13 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
14   base::FuzzedDataProvider fuzz_data(data, size);
15   const bool is_client = fuzz_data.ConsumeBool();
16   const ipp::Operation oper_id =
17       static_cast<ipp::Operation>(fuzz_data.ConsumeUint16());
18   const std::string packet_str = fuzz_data.ConsumeRemainingBytes();
19   const std::vector<uint8_t> packet_bytes(packet_str.begin(), packet_str.end());
20 
21   if (is_client) {
22     ipp::Client client;
23     client.ReadResponseFrameFrom(packet_bytes);
24     auto response = ipp::Response::NewResponse(oper_id);
25     if (response == nullptr)
26       response = std::make_unique<ipp::Response>(oper_id);
27     client.ParseResponseAndSaveTo(response.get());
28   } else {
29     ipp::Server server;
30     server.ReadRequestFrameFrom(packet_bytes);
31     auto request = ipp::Request::NewRequest(oper_id);
32     if (request == nullptr)
33       request = std::make_unique<ipp::Request>(oper_id);
34     server.ParseRequestAndSaveTo(request.get());
35   }
36 
37   return 0;
38 }
39