1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // Adapted from avrcp_packet_test.cc
18 #include <stddef.h>
19 #include <stdint.h>
20 #include "avrcp_packet.h"
21 #include "avrcp_test_packets.h"
22 #include "packet_test_helper.h"
23 
24 namespace bluetooth {
25 
26 // A helper class that has public accessors to protected methods
27 class TestPacketBuilder : public PacketBuilder {
28  public:
MakeBuilder(std::vector<uint8_t> data)29   static std::unique_ptr<TestPacketBuilder> MakeBuilder(
30       std::vector<uint8_t> data) {
31     std::unique_ptr<TestPacketBuilder> builder(new TestPacketBuilder(data));
32     return builder;
33   }
34 
35   // Make all the utility functions public
36   using PacketBuilder::AddPayloadOctets1;
37   using PacketBuilder::AddPayloadOctets2;
38   using PacketBuilder::AddPayloadOctets3;
39   using PacketBuilder::AddPayloadOctets4;
40   using PacketBuilder::AddPayloadOctets6;
41   using PacketBuilder::AddPayloadOctets8;
42   using PacketBuilder::ReserveSpace;
43 
size() const44   size_t size() const override { return data_.size(); };
45 
Serialize(const std::shared_ptr<Packet> & pkt)46   bool Serialize(const std::shared_ptr<Packet>& pkt) override {
47     ReserveSpace(pkt, size());
48 
49     for (uint8_t byte : data_) {
50       AddPayloadOctets1(pkt, byte);
51     }
52 
53     return true;
54   }
55 
TestPacketBuilder(std::vector<uint8_t> data)56   explicit TestPacketBuilder(std::vector<uint8_t> data) : data_(data) {}
57 
58   std::vector<uint8_t> data_;
59 };
60 
61 namespace avrcp {
62 
63 using TestAvrcpPacket = TestPacketType<Packet>;
64 
LLVMFuzzerTestOneInput(const char * data,size_t size)65 extern "C" int LLVMFuzzerTestOneInput(const char* data, size_t size) {
66   std::vector<uint8_t> get_capabilities_request_payload;
67 
68   if (size >= 8) {
69     get_capabilities_request.push_back(0);
70     for (int x = 0; x < 6; x++) {
71       get_capabilities_request_payload.push_back(data[x]);
72     }
73 
74     auto cap_req_builder =
75         TestPacketBuilder::MakeBuilder(get_capabilities_request_payload);
76 
77     auto builder = PacketBuilder::MakeBuilder(
78         CType::STATUS, 0x09, 0x00, Opcode::VENDOR, std::move(cap_req_builder));
79 
80     auto test_packet = TestAvrcpPacket::Make();
81   }
82 
83   return 0;
84 }
85 
86 }  // namespace avrcp
87 }  // namespace bluetooth
88