1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "softbusclientstub2_fuzzer.h"
17 
18 #include "client_trans_channel_manager.h"
19 #include "softbus_client_stub.h"
20 #include "softbus_server_ipc_interface_code.h"
21 
22 namespace {
23 const std::u16string SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN = u"OHOS.ISoftBusClient";
24 const std::vector<SoftBusFuncId> CODE_LIST = {
25     CLIENT_ON_CHANNEL_OPENED,
26     CLIENT_ON_CHANNEL_OPENFAILED,
27     CLIENT_ON_CHANNEL_LINKDOWN,
28     CLIENT_ON_CHANNEL_CLOSED,
29     CLIENT_ON_CHANNEL_MSGRECEIVED,
30     CLIENT_ON_CHANNEL_QOSEVENT,
31     CLIENT_ON_JOIN_RESULT,
32     CLIENT_ON_JOIN_METANODE_RESULT,
33     CLIENT_ON_LEAVE_RESULT,
34     CLIENT_ON_LEAVE_METANODE_RESULT,
35     CLIENT_ON_NODE_DEVICE_NOT_TRUST,
36     CLIENT_ON_HICHAIN_PROOF_EXCEPTION,
37     CLIENT_ON_NODE_ONLINE_STATE_CHANGED,
38     CLIENT_ON_NODE_BASIC_INFO_CHANGED,
39     CLIENT_ON_LOCAL_NETWORK_ID_CHANGED,
40     CLIENT_ON_TIME_SYNC_RESULT,
41     CLIENT_ON_PUBLISH_LNN_RESULT,
42     CLIENT_ON_REFRESH_LNN_RESULT,
43     CLIENT_ON_REFRESH_DEVICE_FOUND,
44     CLIENT_ON_PERMISSION_CHANGE,
45     CLIENT_SET_CHANNEL_INFO,
46     CLIENT_ON_DATA_LEVEL_CHANGED,
47     CLIENT_ON_TRANS_LIMIT_CHANGE,
48     CLIENT_ON_CHANNEL_BIND,
49 };
50 
51 class TestEnv {
52 public:
TestEnv()53     TestEnv()
54     {
55         isInited_ = false;
56         stub_ = new OHOS::SoftBusClientStub();
57         if (stub_ == nullptr) {
58             return;
59         }
60         isInited_ = true;
61         (void)ClientTransChannelInit();
62     }
63 
~TestEnv()64     ~TestEnv()
65     {
66         isInited_ = false;
67         stub_ = nullptr;
68         (void)ClientTransChannelDeinit();
69     }
70 
IsInited(void) const71     bool IsInited(void) const noexcept
72     {
73         return isInited_;
74     }
75 
DoRemoteRequest(SoftBusFuncId code,OHOS::MessageParcel & data)76     void DoRemoteRequest(SoftBusFuncId code, OHOS::MessageParcel &data)
77     {
78         if (code == CLIENT_ON_CHANNEL_OPENFAILED ||
79             code == CLIENT_ON_CHANNEL_CLOSED ||
80             code == CLIENT_ON_CHANNEL_MSGRECEIVED) {
81             return;
82         }
83         OHOS::MessageParcel reply;
84         OHOS::MessageOption option;
85         if (stub_ != nullptr) {
86             stub_->OnRemoteRequest(static_cast<uint32_t>(code), data, reply, option);
87         }
88     }
89 
90 private:
91     volatile bool isInited_;
92     OHOS::sptr<OHOS::SoftBusClientStub> stub_;
93 };
94 } // anonymous namespace
95 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)96 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
97 {
98     static TestEnv env;
99     if (!env.IsInited()) {
100         return 0;
101     }
102 
103     if (data == nullptr || size == 0) {
104         return 0;
105     }
106     SoftBusFuncId code = CODE_LIST[data[0] % CODE_LIST.size()];
107 
108     OHOS::MessageParcel parcel;
109     parcel.WriteInterfaceToken(SOFTBUS_CLIENT_STUB_INTERFACE_TOKEN);
110     parcel.WriteBuffer(data + 1, size - 1);
111 
112     env.DoRemoteRequest(code, parcel);
113     return 0;
114 }
115