1 /*
2 * Copyright (c) 2022 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 "setvoicemailinfo_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20 #include <string_ex.h>
21 #include <thread>
22
23 #define private public
24 #include "addcoreservicetoken_fuzzer.h"
25 #include "core_service.h"
26 #include "napi_util.h"
27 #include "system_ability_definition.h"
28 #include "tel_event_handler.h"
29 #include "unistd.h"
30 #include "tel_ril_manager.h"
31
32 using namespace OHOS::Telephony;
33 namespace OHOS {
34 static bool g_isInited = false;
35 constexpr int32_t SLOT_NUM = 2;
36 constexpr int32_t LOCK_TYPE = 2;
37
IsServiceInited()38 bool IsServiceInited()
39 {
40 if (!g_isInited) {
41 DelayedSingleton<CoreService>::GetInstance()->OnStart();
42 if (DelayedSingleton<CoreService>::GetInstance()->GetServiceRunningState() ==
43 static_cast<int32_t>(ServiceRunningState::STATE_RUNNING)) {
44 g_isInited = true;
45 }
46 }
47 return g_isInited;
48 }
49
GetDefaultVoiceSlotId(const uint8_t * data,size_t size)50 void GetDefaultVoiceSlotId(const uint8_t *data, size_t size)
51 {
52 if (!IsServiceInited()) {
53 return;
54 }
55
56 MessageParcel dataMessageParcel;
57 dataMessageParcel.WriteBuffer(data, size);
58 dataMessageParcel.RewindRead(0);
59 MessageParcel reply;
60 DelayedSingleton<CoreService>::GetInstance()->OnGetDefaultVoiceSlotId(dataMessageParcel, reply);
61 }
62
GetActiveSimAccountInfoList(const uint8_t * data,size_t size)63 void GetActiveSimAccountInfoList(const uint8_t *data, size_t size)
64 {
65 if (!IsServiceInited()) {
66 return;
67 }
68
69 MessageParcel dataMessageParcel;
70 dataMessageParcel.WriteBuffer(data, size);
71 dataMessageParcel.RewindRead(0);
72 MessageParcel reply;
73 DelayedSingleton<CoreService>::GetInstance()->OnGetActiveSimAccountInfoList(dataMessageParcel, reply);
74 }
75
GetOperatorConfigs(const uint8_t * data,size_t size)76 void GetOperatorConfigs(const uint8_t *data, size_t size)
77 {
78 if (!IsServiceInited()) {
79 return;
80 }
81
82 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
83 MessageParcel dataMessageParcel;
84 dataMessageParcel.WriteInt32(slotId);
85 dataMessageParcel.WriteBuffer(data, size);
86 dataMessageParcel.RewindRead(0);
87 MessageParcel reply;
88 DelayedSingleton<CoreService>::GetInstance()->OnGetOperatorConfig(dataMessageParcel, reply);
89 }
90
GetLockState(const uint8_t * data,size_t size)91 void GetLockState(const uint8_t *data, size_t size)
92 {
93 if (!IsServiceInited()) {
94 return;
95 }
96
97 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
98 MessageParcel dataMessageParcel;
99 dataMessageParcel.WriteInt32(slotId);
100 dataMessageParcel.WriteInt32(static_cast<int32_t>(*data % LOCK_TYPE));
101 dataMessageParcel.WriteBuffer(data, size);
102 dataMessageParcel.RewindRead(0);
103 MessageParcel reply;
104 DelayedSingleton<CoreService>::GetInstance()->OnGetLockState(dataMessageParcel, reply);
105 }
106
SetVoiceMailInfo(const uint8_t * data,size_t size)107 void SetVoiceMailInfo(const uint8_t *data, size_t size)
108 {
109 if (!IsServiceInited()) {
110 return;
111 }
112
113 int32_t slotId = static_cast<int32_t>(*data % SLOT_NUM);
114 std::string mailNumber(reinterpret_cast<const char *>(data), size);
115 std::string mailName(reinterpret_cast<const char *>(data), size);
116 auto mailNameU16 = Str8ToStr16(mailName);
117 auto mailNumberU16 = Str8ToStr16(mailNumber);
118 MessageParcel dataMessageParcel;
119 dataMessageParcel.WriteInt32(slotId);
120 dataMessageParcel.WriteString16(mailNameU16);
121 dataMessageParcel.WriteString16(mailNumberU16);
122 dataMessageParcel.RewindRead(0);
123 MessageParcel reply;
124 DelayedSingleton<CoreService>::GetInstance()->OnSetVoiceMailInfo(dataMessageParcel, reply);
125 }
126
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)127 void DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size)
128 {
129 if (data == nullptr || size == 0) {
130 return;
131 }
132
133 GetDefaultVoiceSlotId(data, size);
134 GetOperatorConfigs(data, size);
135 GetActiveSimAccountInfoList(data, size);
136 GetLockState(data, size);
137 SetVoiceMailInfo(data, size);
138 auto telRilManager = std::static_pointer_cast<TelRilManager>(
139 DelayedSingleton<CoreService>::GetInstance()->telRilManager_);
140 if (telRilManager == nullptr || telRilManager->handler_ == nullptr) {
141 return;
142 }
143 telRilManager->handler_->ClearFfrt(false);
144 telRilManager->handler_->queue_ = nullptr;
145 return;
146 }
147 } // namespace OHOS
148
149 /* Fuzzer entry point */
LLVMFuzzerInitialize(int * argc,char *** argv)150 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
151 {
152 OHOS::AddCoreServiceTokenFuzzer token;
153 return 0;
154 }
155
156 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)157 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
158 {
159 /* Run your code on data */
160 OHOS::DoSomethingInterestingWithMyAPI(data, size);
161 OHOS::DelayedSingleton<CoreService>::DestroyInstance();
162 return 0;
163 }
164