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