• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2024-2025 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 "audio_log.h"
17 #include "audio_microphone_descriptor.h"
18 #include "audio_router_map.h"
19 
20 using namespace std;
21 
22 namespace OHOS {
23 namespace AudioStandard {
24 
25 static const uint8_t* RAW_DATA = nullptr;
26 static size_t g_dataSize = 0;
27 static size_t g_pos;
28 const size_t THRESHOLD = 10;
29 const int32_t NUM_3 = 3;
30 typedef void (*TestPtr)();
31 
32 const vector<DeviceType> g_testDeviceTypes = {
33     DEVICE_TYPE_NONE,
34     DEVICE_TYPE_INVALID,
35     DEVICE_TYPE_EARPIECE,
36     DEVICE_TYPE_SPEAKER,
37     DEVICE_TYPE_WIRED_HEADSET,
38     DEVICE_TYPE_WIRED_HEADPHONES,
39     DEVICE_TYPE_BLUETOOTH_SCO,
40     DEVICE_TYPE_BLUETOOTH_A2DP,
41     DEVICE_TYPE_BLUETOOTH_A2DP_IN,
42     DEVICE_TYPE_MIC,
43     DEVICE_TYPE_WAKEUP,
44     DEVICE_TYPE_USB_HEADSET,
45     DEVICE_TYPE_DP,
46     DEVICE_TYPE_REMOTE_CAST,
47     DEVICE_TYPE_USB_DEVICE,
48     DEVICE_TYPE_ACCESSORY,
49     DEVICE_TYPE_REMOTE_DAUDIO,
50     DEVICE_TYPE_HDMI,
51     DEVICE_TYPE_LINE_DIGITAL,
52     DEVICE_TYPE_NEARLINK,
53     DEVICE_TYPE_NEARLINK_IN,
54     DEVICE_TYPE_FILE_SINK,
55     DEVICE_TYPE_FILE_SOURCE,
56     DEVICE_TYPE_EXTERN_CABLE,
57     DEVICE_TYPE_DEFAULT,
58     DEVICE_TYPE_USB_ARM_HEADSET,
59     DEVICE_TYPE_MAX,
60 };
61 
62 template<class T>
GetArrLength(T & arr)63 uint32_t GetArrLength(T& arr)
64 {
65     if (arr == nullptr) {
66         AUDIO_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
67         return 0;
68     }
69     return sizeof(arr) / sizeof(arr[0]);
70 }
71 
72 template<class T>
GetData()73 T GetData()
74 {
75     T object {};
76     size_t objectSize = sizeof(object);
77     if (g_dataSize < g_pos) {
78         return object;
79     }
80     if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
81         return object;
82     }
83     errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
84     if (ret != EOK) {
85         return {};
86     }
87     g_pos += objectSize;
88     return object;
89 }
90 
AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest()91 void AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest()
92 {
93     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
94     bool isMute = GetData<bool>();
95     audioMicrophoneDescriptor.SetMicrophoneMute(isMute);
96 }
97 
AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest()98 void AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest()
99 {
100     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
101     bool isMute = GetData<bool>();
102     audioMicrophoneDescriptor.SetMicrophoneMutePersistent(isMute);
103 }
104 
AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest()105 void AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest()
106 {
107     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
108 
109     audioMicrophoneDescriptor.GetPersistentMicMuteState();
110 }
111 
AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest()112 void AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest()
113 {
114     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
115     bool isMute = GetData<bool>();
116     audioMicrophoneDescriptor.isMicrophoneMutePersistent_ = GetData<bool>();
117     audioMicrophoneDescriptor.InitPersistentMicrophoneMuteState(isMute);
118 }
119 
AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest()120 void AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest()
121 {
122     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
123     audioMicrophoneDescriptor.IsMicrophoneMute();
124 }
125 
AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest()126 void AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest()
127 {
128     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
129     audioMicrophoneDescriptor.GetMicrophoneMuteTemporary();
130     audioMicrophoneDescriptor.GetMicrophoneMutePersistent();
131 }
132 
AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest()133 void AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest()
134 {
135     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
136     if (g_testDeviceTypes.size() == 0) {
137         return;
138     }
139     DeviceType devType = g_testDeviceTypes[GetData<uint32_t>() % g_testDeviceTypes.size()];
140     int32_t sessionId = GetData<int32_t>();
141     sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
142     audioMicrophoneDescriptor.connectedMicrophones_.push_back(microphoneDescriptor);
143     audioMicrophoneDescriptor.AddAudioCapturerMicrophoneDescriptor(sessionId, devType);
144 }
145 
AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest()146 void AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest()
147 {
148     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
149     int32_t sessionId = GetData<int32_t>();
150     sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
151     audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.clear();
152     audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.insert({sessionId, microphoneDescriptor});
153     audioMicrophoneDescriptor.GetAudioCapturerMicrophoneDescriptors(sessionId);
154 }
155 
AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest()156 void AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest()
157 {
158     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
159     if (g_testDeviceTypes.size() == 0) {
160         return;
161     }
162     DeviceType devType = g_testDeviceTypes[GetData<uint32_t>() % g_testDeviceTypes.size()];
163     sptr<MicrophoneDescriptor> microphoneDescriptor = new MicrophoneDescriptor();
164     audioMicrophoneDescriptor.connectedMicrophones_.push_back(microphoneDescriptor);
165     microphoneDescriptor->deviceType_ = devType;
166     int32_t sessionId = GetData<int32_t>();
167     audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.clear();
168     audioMicrophoneDescriptor.audioCaptureMicrophoneDescriptor_.insert({sessionId, microphoneDescriptor});
169     audioMicrophoneDescriptor.UpdateAudioCapturerMicrophoneDescriptor(devType);
170     audioMicrophoneDescriptor.GetAvailableMicrophones();
171 }
172 
AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest()173 void AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest()
174 {
175     AudioMicrophoneDescriptor &audioMicrophoneDescriptor = AudioMicrophoneDescriptor::GetInstance();
176     int32_t uid = GetData<int32_t>();
177     audioMicrophoneDescriptor.RemoveAudioCapturerMicrophoneDescriptor(uid);
178 }
179 
AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest()180 void AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest()
181 {
182     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
183     int32_t uid = GetData<int32_t>();
184     int32_t pid = GetData<int32_t>();
185     uint32_t index = GetData<uint32_t>() % NUM_3;
186     audioRouteMap.routerMap_.clear();
187     if (index == 0) {
188         audioRouteMap.routerMap_.insert({uid, {"testNetworkId", pid}});
189     } else if (index == 1) {
190         audioRouteMap.routerMap_.insert({uid, {"testNetworkId", -1}});
191     } else {
192         audioRouteMap.routerMap_.insert({uid, {"testNetworkId", GetData<int32_t>()}});
193     }
194     audioRouteMap.GetDeviceInfoByUidAndPid(uid, pid);
195 }
196 
AudioRouteMapDelRouteMapInfoByKeyFuzzTest()197 void AudioRouteMapDelRouteMapInfoByKeyFuzzTest()
198 {
199     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
200     int32_t uid = GetData<int32_t>();
201     audioRouteMap.routerMap_.clear();
202     audioRouteMap.routerMap_.insert({uid, {"testNetworkId", GetData<int32_t>()}});
203 
204     audioRouteMap.DelRouteMapInfoByKey(uid);
205 }
206 
AudioRouteMapAddRouteMapInfoFuzzTest()207 void AudioRouteMapAddRouteMapInfoFuzzTest()
208 {
209     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
210     int32_t uid = GetData<int32_t>();
211     int32_t pid = GetData<int32_t>();
212     std::string device = "testDevice";
213 
214     audioRouteMap.AddRouteMapInfo(uid, device, pid);
215 }
216 
AudioRouteMapAddFastRouteMapInfoFuzzTest()217 void AudioRouteMapAddFastRouteMapInfoFuzzTest()
218 {
219     static const vector<DeviceRole> testDeviceRoles = {
220         DEVICE_ROLE_NONE,
221         INPUT_DEVICE,
222         OUTPUT_DEVICE,
223         DEVICE_ROLE_MAX,
224     };
225     if (testDeviceRoles.size() == 0) {
226         return;
227     }
228     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
229     int32_t uid = GetData<int32_t>();
230     std::string device = "testDevice";
231     DeviceRole role = testDeviceRoles[GetData<uint32_t>() % testDeviceRoles.size()];
232 
233     audioRouteMap.AddFastRouteMapInfo(uid, device, role);
234 }
235 
AudioRouteMapRemoveDeviceInRouterMapFuzzTest()236 void AudioRouteMapRemoveDeviceInRouterMapFuzzTest()
237 {
238     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
239     audioRouteMap.routerMap_.clear();
240     int32_t uid = GetData<int32_t>();
241     std::string networkId = "testNetworkId";
242     audioRouteMap.routerMap_.insert({uid, {"testNetworkId1", GetData<int32_t>()}});
243     audioRouteMap.routerMap_.insert({uid + 1, {"testNetworkId", GetData<int32_t>()}});
244 
245     audioRouteMap.RemoveDeviceInRouterMap(networkId);
246 }
247 
AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest()248 void AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest()
249 {
250     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
251     audioRouteMap.fastRouterMap_.clear();
252     int32_t uid = GetData<int32_t>();
253     std::string networkId = "testNetworkId";
254     audioRouteMap.fastRouterMap_.insert({uid, {networkId, DEVICE_ROLE_NONE}});
255     audioRouteMap.fastRouterMap_.insert({uid + 1, {"testNetworkId1", DEVICE_ROLE_NONE}});
256 
257     audioRouteMap.RemoveDeviceInFastRouterMap(networkId);
258 }
259 
AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest()260 void AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest()
261 {
262     AudioRouteMap &audioRouteMap = AudioRouteMap::GetInstance();
263     audioRouteMap.fastRouterMap_.clear();
264     int32_t uid = GetData<int32_t>();
265     std::string networkId = "testNetworkId";
266     audioRouteMap.fastRouterMap_.insert({uid, {networkId, DEVICE_ROLE_NONE}});
267     audioRouteMap.fastRouterMap_.insert({uid + 1, {"testNetworkId1", DEVICE_ROLE_NONE}});
268 
269     audioRouteMap.GetNetworkIDInFastRouterMap(uid, DEVICE_ROLE_NONE, networkId);
270 }
271 
272 TestPtr g_testPtrs[] = {
273     AudioMicrophoneDescriptorSetMicrophoneMuteFuzzTest,
274     AudioMicrophoneDescriptorSetMicrophoneMutePersistentFuzzTest,
275     AudioMicrophoneDescriptorGetPersistentMicMuteStateFuzzTest,
276     AudioMicrophoneDescriptorInitPersistentMicrophoneMuteStateFuzzTest,
277     AudioMicrophoneDescriptorIsMicrophoneMuteFuzzTest,
278     AudioMicrophoneDescriptorGetMicrophoneMuteTemporaryFuzzTest,
279     AudioMicrophoneDescriptorAddAudioCapturerMicrophoneDescriptorFuzzTest,
280     AudioMicrophoneDescriptorGetAudioCapturerMicrophoneDescriptorsFuzzTest,
281     AudioMicrophoneDescriptorUpdateAudioCapturerMicrophoneDescriptorFuzzTest,
282     AudioMicrophoneDescriptorRemoveAudioCapturerMicrophoneDescriptorFuzzTest,
283     AudioRouteMapGetDeviceInfoByUidAndPidFuzzTest,
284     AudioRouteMapDelRouteMapInfoByKeyFuzzTest,
285     AudioRouteMapAddRouteMapInfoFuzzTest,
286     AudioRouteMapAddFastRouteMapInfoFuzzTest,
287     AudioRouteMapRemoveDeviceInRouterMapFuzzTest,
288     AudioRouteMapRemoveDeviceInFastRouterMapFuzzTest,
289     AudioRouteMapGetNetworkIDInFastRouterMapFuzzTest,
290 };
291 
FuzzTest(const uint8_t * rawData,size_t size)292 void FuzzTest(const uint8_t* rawData, size_t size)
293 {
294     if (rawData == nullptr) {
295         return;
296     }
297 
298     RAW_DATA = rawData;
299     g_dataSize = size;
300     g_pos = 0;
301 
302     uint32_t code = GetData<uint32_t>();
303     uint32_t len = GetArrLength(g_testPtrs);
304     if (len > 0) {
305         g_testPtrs[code % len]();
306     } else {
307         AUDIO_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
308     }
309     return;
310 }
311 
312 } // namespace AudioStandard
313 } // namesapce OHOS
314 
315 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)316 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
317 {
318     if (size < OHOS::AudioStandard::THRESHOLD) {
319         return 0;
320     }
321     OHOS::AudioStandard::FuzzTest(data, size);
322     return 0;
323 }