• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "device_fuzzer.h"
17 
18 #include <cstddef>
19 #include <cstdint>
20 #include <securec.h>
21 #include <string>
22 
23 #include "display_common_fuzzer.h"
24 
25 namespace OHOS {
26 using namespace OHOS::HDI::Display::Buffer::V1_0;
27 using namespace OHOS::HDI::Display::Composer::V1_3;
28 
29 static sptr<Composer::V1_3::IDisplayComposerInterface> g_composerInterface = nullptr;
30 static std::shared_ptr<IDisplayBuffer> g_bufferInterface = nullptr;
31 
32 static bool g_isInit = false;
33 static const uint8_t* g_data = nullptr;
34 static size_t g_dataSize = 0;
35 static size_t g_pos;
36 
37 /*
38 * describe: get data from outside untrusted data(g_data) which size is according to sizeof(T)
39 * tips: only support basic type
40 */
41 template<class T>
GetData()42 T GetData()
43 {
44     T object {};
45     size_t objectSize = sizeof(object);
46     if (g_data == nullptr || objectSize > g_dataSize - g_pos) {
47         return object;
48     }
49     errno_t ret = memcpy_s(&object, objectSize, g_data + g_pos, objectSize);
50     if (ret != EOK) {
51         return {};
52     }
53     g_pos += objectSize;
54     return object;
55 }
56 
GetAllocInfo(AllocInfo & info)57 static int32_t GetAllocInfo(AllocInfo& info)
58 {
59     uint32_t lenUsage = GetArrLength(CONVERT_TABLE_USAGE);
60     if (lenUsage == 0) {
61         HDF_LOGE("%{public}s: CONVERT_TABLE_USAGE length is equal to 0", __func__);
62         return DISPLAY_FAILURE;
63     }
64     uint32_t lenFormat = GetArrLength(CONVERT_TABLE_FORMAT);
65     if (lenFormat == 0) {
66         HDF_LOGE("%{public}s: CONVERT_TABLE_FORMAT length is equal to 0", __func__);
67         return DISPLAY_FAILURE;
68     }
69 
70     info.width = GetData<uint32_t>() % WIDTH;
71     info.height = GetData<uint32_t>() % HEIGHT;
72     info.usage = CONVERT_TABLE_USAGE[GetData<uint32_t>() % lenUsage];
73     info.format = CONVERT_TABLE_FORMAT[GetData<uint32_t>() % lenFormat];
74     info.expectedSize = info.width * info.height;
75 
76     return DISPLAY_SUCCESS;
77 }
78 
GetIRect(IRect & rect)79 static int32_t GetIRect(IRect& rect)
80 {
81     rect.x = GetData<int32_t>();
82     rect.y = GetData<int32_t>();
83     rect.w = GetData<int32_t>();
84     rect.h = GetData<int32_t>();
85     return DISPLAY_SUCCESS;
86 }
87 
UsingAllocmem()88 BufferHandle* UsingAllocmem()
89 {
90     AllocInfo info = { 0 };
91     int32_t ret = GetAllocInfo(info);
92     if (ret != DISPLAY_SUCCESS) {
93         HDF_LOGE("%{public}s: function GetAllocInfo failed", __func__);
94         return nullptr;
95     }
96 
97     BufferHandle* handle = nullptr;
98     ret = g_bufferInterface->AllocMem(info, handle);
99     if (ret != DISPLAY_SUCCESS) {
100         HDF_LOGE("%{public}s: function AllocMem failed", __func__);
101         return nullptr;
102     }
103     return handle;
104 }
105 
TestSetClientBufferCacheCount(uint32_t devId)106 int32_t TestSetClientBufferCacheCount(uint32_t devId)
107 {
108     uint32_t cacheCount = GetData<uint32_t>();
109     int32_t ret = g_composerInterface->SetClientBufferCacheCount(devId, cacheCount);
110     if (ret != DISPLAY_SUCCESS) {
111         HDF_LOGE("%{public}s: function SetClientBufferCacheCount failed", __func__);
112         return DISPLAY_FAILURE;
113     }
114     return ret;
115 }
116 
TestGetDisplaySupportedModes(uint32_t devId)117 int32_t TestGetDisplaySupportedModes(uint32_t devId)
118 {
119     DisplayModeInfo info = { 0 };
120     info.width = GetData<int32_t>() % WIDTH;
121     info.height = GetData<int32_t>() % HEIGHT;
122     info.freshRate = GetData<uint32_t>();
123     info.id = GetData<int32_t>();
124 
125     std::vector<DisplayModeInfo> infos;
126     infos.push_back(info);
127     int32_t ret = g_composerInterface->GetDisplaySupportedModes(devId, infos);
128     if (ret != DISPLAY_SUCCESS) {
129         HDF_LOGE("%{public}s: function GetDisplaySupportedModes failed", __func__);
130         return DISPLAY_FAILURE;
131     }
132     return ret;
133 }
134 
TestSetGetDisplayMode(uint32_t devId)135 int32_t TestSetGetDisplayMode(uint32_t devId)
136 {
137     uint32_t modeId = GetData<uint32_t>();
138     int32_t ret = g_composerInterface->SetDisplayMode(devId, modeId);
139     if (ret != DISPLAY_SUCCESS) {
140         HDF_LOGE("%{public}s: function SetDisplayMode failed", __func__);
141         return DISPLAY_FAILURE;
142     }
143     ret = g_composerInterface->GetDisplayMode(devId, modeId);
144     if (ret != DISPLAY_SUCCESS) {
145         HDF_LOGE("%{public}s: function GetDisplayMode failed", __func__);
146         return DISPLAY_FAILURE;
147     }
148     return ret;
149 }
150 
TestSetGetDisplayPowerStatus(uint32_t devId)151 int32_t TestSetGetDisplayPowerStatus(uint32_t devId)
152 {
153     uint32_t len = GetArrLength(CONVERT_TABLE_POWER_STATUS);
154     if (len == 0) {
155         HDF_LOGE("%{public}s: CONVERT_TABLE_POWER_STATUS length is equal to 0", __func__);
156         return DISPLAY_FAILURE;
157     }
158     Composer::V1_0::DispPowerStatus status = CONVERT_TABLE_POWER_STATUS[GetData<uint32_t>() % len];
159     int32_t ret = g_composerInterface->SetDisplayPowerStatus(devId, status);
160     if (ret != DISPLAY_SUCCESS) {
161         HDF_LOGE("%{public}s: function SetDisplayPowerStatus failed", __func__);
162         return DISPLAY_FAILURE;
163     }
164     ret = g_composerInterface->GetDisplayPowerStatus(devId, status);
165     if (ret != DISPLAY_SUCCESS) {
166         HDF_LOGE("%{public}s: function GetDisplayPowerStatus failed", __func__);
167         return DISPLAY_FAILURE;
168     }
169     return ret;
170 }
171 
TestPrepareDisplayLayers(uint32_t devId)172 int32_t TestPrepareDisplayLayers(uint32_t devId)
173 {
174     bool needFlushFb = GetRandBoolValue(GetData<uint32_t>());
175     int32_t ret = g_composerInterface->PrepareDisplayLayers(devId, needFlushFb);
176     if (ret != DISPLAY_SUCCESS) {
177         HDF_LOGE("%{public}s: function PrepareDisplayLayers failed", __func__);
178         return DISPLAY_FAILURE;
179     }
180     return ret;
181 }
182 
TestSetGetDisplayBacklight(uint32_t devId)183 int32_t TestSetGetDisplayBacklight(uint32_t devId)
184 {
185     uint32_t level = GetData<uint32_t>();
186     int32_t ret = g_composerInterface->SetDisplayBacklight(devId, level);
187     if (ret != DISPLAY_SUCCESS) {
188         HDF_LOGE("%{public}s: function SetDisplayBacklight failed", __func__);
189         return DISPLAY_FAILURE;
190     }
191     ret = g_composerInterface->GetDisplayBacklight(devId, level);
192     if (ret != DISPLAY_SUCCESS) {
193         HDF_LOGE("%{public}s: function GetDisplayBacklight failed", __func__);
194         return DISPLAY_FAILURE;
195     }
196     return ret;
197 }
198 
TestGetDisplayProperty(uint32_t devId)199 int32_t TestGetDisplayProperty(uint32_t devId)
200 {
201     uint32_t id = GetData<uint32_t>();
202     uint64_t value = GetData<uint32_t>();
203     int32_t ret = g_composerInterface->GetDisplayProperty(devId, id, value);
204     if (ret != DISPLAY_SUCCESS) {
205         HDF_LOGE("%{public}s: function GetDisplayProperty failed", __func__);
206         return DISPLAY_FAILURE;
207     }
208     return ret;
209 }
210 
TestUpdateHardwareCursor(uint32_t devId)211 int32_t TestUpdateHardwareCursor(uint32_t devId)
212 {
213     BufferHandle* buffer = UsingAllocmem();
214     if (buffer == nullptr) {
215         HDF_LOGE("%{public}s: Failed to UsingAllocmem", __func__);
216         return DISPLAY_FAILURE;
217     }
218 
219     int32_t x = GetData<uint32_t>();
220     int32_t y = GetData<uint32_t>();
221     int32_t ret = g_composerInterface->UpdateHardwareCursor(devId, x, y, buffer);
222     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
223         HDF_LOGE("%{public}s: function UpdateHardwareCursor failed, %{public}d", __func__, ret);
224         return DISPLAY_FAILURE;
225     }
226     return DISPLAY_SUCCESS;
227 }
228 
TestEnableHardwareCursorStats(uint32_t devId)229 int32_t TestEnableHardwareCursorStats(uint32_t devId)
230 {
231     bool enable = GetRandBoolValue(GetData<uint32_t>());
232     int32_t ret = g_composerInterface->EnableHardwareCursorStats(devId, enable);
233     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
234         HDF_LOGE("%{public}s: function EnableHardwareCursorStats failed, %{public}d", __func__, ret);
235         return DISPLAY_FAILURE;
236     }
237     return DISPLAY_SUCCESS;
238 }
239 
TestGetHardwareCursorStats(uint32_t devId)240 int32_t TestGetHardwareCursorStats(uint32_t devId)
241 {
242     uint32_t frameCount = GetData<uint32_t>();
243     uint32_t vsyncCount = GetData<uint32_t>();
244     int32_t ret = g_composerInterface->GetHardwareCursorStats(devId, frameCount, vsyncCount);
245     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
246         HDF_LOGE("%{public}s: function GetHardwareCursorStats failed, %{public}d", __func__, ret);
247         return DISPLAY_FAILURE;
248     }
249     return DISPLAY_SUCCESS;
250 }
251 
TestGetDisplayCompChange(uint32_t devId)252 int32_t TestGetDisplayCompChange(uint32_t devId)
253 {
254     std::vector<uint32_t> layers;
255     layers.push_back(GetData<uint32_t>());
256     std::vector<int32_t> types;
257     types.push_back(GetData<int32_t>());
258 
259     int32_t ret = g_composerInterface->GetDisplayCompChange(devId, layers, types);
260     if (ret != DISPLAY_SUCCESS) {
261         HDF_LOGE("%{public}s: function GetDisplayCompChange failed", __func__);
262         return DISPLAY_FAILURE;
263     }
264     return ret;
265 }
266 
TestSetDisplayClientCrop(uint32_t devId)267 int32_t TestSetDisplayClientCrop(uint32_t devId)
268 {
269     IRect rect;
270     int32_t ret = GetIRect(rect);
271     if (ret != DISPLAY_SUCCESS) {
272         HDF_LOGE("%{public}s: function GetIRect failed", __func__);
273         return DISPLAY_FAILURE;
274     }
275     ret = g_composerInterface->SetDisplayClientCrop(devId, rect);
276     if (ret != DISPLAY_SUCCESS) {
277         HDF_LOGE("%{public}s: function SetDisplayClientCrop failed", __func__);
278         return DISPLAY_FAILURE;
279     }
280     return ret;
281 }
282 
TestSetDisplayClientDamage(uint32_t devId)283 int32_t TestSetDisplayClientDamage(uint32_t devId)
284 {
285     IRect rect;
286     int32_t ret = GetIRect(rect);
287     if (ret != DISPLAY_SUCCESS) {
288         HDF_LOGE("%{public}s: function GetIRect failed", __func__);
289         return DISPLAY_FAILURE;
290     }
291     std::vector<IRect> rects;
292     rects.push_back(rect);
293     ret = g_composerInterface->SetDisplayClientDamage(devId, rects);
294     if (ret != DISPLAY_SUCCESS) {
295         HDF_LOGE("%{public}s: function SetDisplayClientDamage failed", __func__);
296     }
297     return ret;
298 }
299 
TestSetDisplayVsyncEnabled(uint32_t devId)300 int32_t TestSetDisplayVsyncEnabled(uint32_t devId)
301 {
302     bool enabled = GetRandBoolValue(GetData<uint32_t>());
303     int32_t ret = g_composerInterface->SetDisplayVsyncEnabled(devId, enabled);
304     if (ret != DISPLAY_SUCCESS) {
305         HDF_LOGE("%{public}s: function SetDisplayVsyncEnabled failed", __func__);
306     }
307     return ret;
308 }
309 
TestRegDisplayVBlankCallback(uint32_t devId)310 int32_t TestRegDisplayVBlankCallback(uint32_t devId)
311 {
312     uint32_t param1 = GetData<uint32_t>();
313     VBlankCallback param2 = GetData<VBlankCallback>();
314     void* param3 = malloc(PARAM_VOIDPTR_LEN);
315     if (param3 == nullptr) {
316         HDF_LOGE("%{public}s: void* param3 malloc failed", __func__);
317         return DISPLAY_FAILURE;
318     }
319     int32_t ret = g_composerInterface->RegDisplayVBlankCallback(param1, param2, param3);
320     if (ret != DISPLAY_SUCCESS) {
321         HDF_LOGE("%{public}s: function RegDisplayVBlankCallback failed", __func__);
322     }
323     free(param3);
324     param3 = nullptr;
325     return ret;
326 }
327 
TestGetDisplayReleaseFence(uint32_t devId)328 int32_t TestGetDisplayReleaseFence(uint32_t devId)
329 {
330     std::vector<uint32_t> layers;
331     layers.push_back(GetData<uint32_t>());
332     std::vector<int32_t> fences;
333     fences.push_back(GetData<int32_t>());
334 
335     int32_t ret = g_composerInterface->GetDisplayReleaseFence(devId, layers, fences);
336     if (ret != DISPLAY_SUCCESS) {
337         HDF_LOGE("%{public}s: function GetDisplayReleaseFence failed", __func__);
338     }
339     return ret;
340 }
341 
TestDestroyVirtualDisplay(uint32_t devId)342 int32_t TestDestroyVirtualDisplay(uint32_t devId)
343 {
344     int32_t ret = g_composerInterface->DestroyVirtualDisplay(devId);
345     if (ret != DISPLAY_SUCCESS) {
346         HDF_LOGE("%{public}s: function DestroyVirtualDisplay failed", __func__);
347     }
348     return ret;
349 }
350 
TestSetVirtualDisplayBuffer(uint32_t devId)351 int32_t TestSetVirtualDisplayBuffer(uint32_t devId)
352 {
353     int32_t fence = GetData<int32_t>();
354     BufferHandle* buffer = UsingAllocmem();
355     if (buffer == nullptr) {
356         HDF_LOGE("%{public}s: Failed to UsingAllocmem", __func__);
357         return DISPLAY_FAILURE;
358     }
359     int32_t ret = g_composerInterface->SetVirtualDisplayBuffer(devId, *buffer, fence);
360     if (ret != DISPLAY_SUCCESS) {
361         HDF_LOGE("%{public}s: function SetVirtualDisplayBuffer failed", __func__);
362     }
363     g_bufferInterface->FreeMem(*buffer);
364     return ret;
365 }
366 
TestSetDisplayProperty(uint32_t devId)367 int32_t TestSetDisplayProperty(uint32_t devId)
368 {
369     uint32_t id = GetData<uint32_t>();
370     uint64_t value = GetData<uint64_t>();
371     int32_t ret = g_composerInterface->SetDisplayProperty(devId, id, value);
372     if (ret != DISPLAY_SUCCESS) {
373         HDF_LOGE("%{public}s: SetDisplayProperty failed", __func__);
374     }
375     return ret;
376 }
377 
TestCommit(uint32_t devId)378 int32_t TestCommit(uint32_t devId)
379 {
380     int32_t fence = GetData<int32_t>();
381     int32_t ret = g_composerInterface->Commit(devId, fence);
382     if (ret != DISPLAY_SUCCESS) {
383         HDF_LOGE("%{public}s: function Commit failed", __func__);
384     }
385     return ret;
386 }
387 
TestGetDisplaySupportedModesExt(uint32_t devId)388 int TestGetDisplaySupportedModesExt(uint32_t devId)
389 {
390     std::vector<DisplayModeInfoExt> modes;
391     modes.push_back(GetData<DisplayModeInfoExt>());
392     int32_t ret = g_composerInterface->GetDisplaySupportedModesExt(devId, modes);
393     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
394         HDF_LOGE("%{public}s: GetDisplaySupportedModesExt failed", __func__);
395     }
396     return ret;
397 }
398 
TestModeCallback(uint32_t modeId,uint64_t vBlankPeriod,void * data)399 void TestModeCallback(uint32_t modeId, uint64_t vBlankPeriod, void* data)
400 {
401 }
402 
TestSetDisplayModeAsync(uint32_t devId)403 int TestSetDisplayModeAsync(uint32_t devId)
404 {
405     uint32_t modeid = GetData<uint32_t>();
406     int32_t ret = g_composerInterface->SetDisplayModeAsync(devId, modeid, TestModeCallback);
407     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
408         HDF_LOGE("%{public}s: SetDisplayModeAsync failed", __func__);
409     }
410     return ret;
411 }
412 
TestGetDisplayVBlankPeriod(uint32_t devId)413 int TestGetDisplayVBlankPeriod(uint32_t devId)
414 {
415     uint64_t period = GetData<uint64_t>();
416     int32_t ret = g_composerInterface->GetDisplayVBlankPeriod(devId, period);
417     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
418         HDF_LOGE("%{public}s: GetDisplayVBlankPeriod failed", __func__);
419     }
420     return ret;
421 }
422 
TestSeamlessChangeCallback(uint32_t devId,void * data)423 void TestSeamlessChangeCallback(uint32_t devId, void* data)
424 {
425 }
426 
TestRegSeamlessChangeCallback(uint32_t devId)427 int TestRegSeamlessChangeCallback(uint32_t devId)
428 {
429     int32_t ret = g_composerInterface->RegSeamlessChangeCallback(TestSeamlessChangeCallback, nullptr);
430     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
431         HDF_LOGE("%{public}s: SetDisplayModeAsync failed", __func__);
432     }
433     return ret;
434 }
435 
TestGetSupportedLayerPerFrameParameterKey(uint32_t devId)436 int TestGetSupportedLayerPerFrameParameterKey(uint32_t devId)
437 {
438     std::vector<std::string> keys;
439     int32_t ret = g_composerInterface->GetSupportedLayerPerFrameParameterKey(keys);
440     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
441         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
442     }
443     return ret;
444 }
445 
TestSetDisplayOverlayResolution(uint32_t devId)446 int TestSetDisplayOverlayResolution(uint32_t devId)
447 {
448     uint32_t width = GetData<uint32_t>() % WIDTH;
449     uint32_t height = GetData<uint32_t>() % HEIGHT;
450     int32_t ret = g_composerInterface->SetDisplayOverlayResolution(devId, width, height);
451     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
452         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
453     }
454     return ret;
455 }
456 
TestRefreshCallback(uint32_t devId,void * data)457 static void TestRefreshCallback(uint32_t devId, void* data)
458 {
459 }
460 
TestRegRefreshCallback(uint32_t devId)461 int TestRegRefreshCallback(uint32_t devId)
462 {
463     int32_t ret = g_composerInterface->RegRefreshCallback(TestRefreshCallback, nullptr);
464     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
465         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
466     }
467     return ret;
468 }
469 
TestGetDisplaySupportedColorGamuts(uint32_t devId)470 int TestGetDisplaySupportedColorGamuts(uint32_t devId)
471 {
472     std::vector<ColorGamut> gamuts;
473     int32_t ret = g_composerInterface->GetDisplaySupportedColorGamuts(devId, gamuts);
474     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
475         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
476     }
477     return ret;
478 }
479 
TestGetHDRCapabilityInfos(uint32_t devId)480 int TestGetHDRCapabilityInfos(uint32_t devId)
481 {
482     HDRCapability info = { 0 };
483     int32_t ret = g_composerInterface->GetHDRCapabilityInfos(devId, info);
484     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
485         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
486     }
487     return ret;
488 }
489 
TestGetDisplayIdentificationData(uint32_t devId)490 int TestGetDisplayIdentificationData(uint32_t devId)
491 {
492     uint8_t portId = GetData<uint8_t>();
493     std::vector<uint8_t> edidData = {};
494     edidData.push_back(GetData<uint8_t>());
495     int32_t ret = g_composerInterface->GetDisplayIdentificationData(devId, portId, edidData);
496     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
497         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
498     }
499     HDF_LOGD("displayId[%u], portId[%u], edidDataLength[%u]", devId, portId, edidData.size());
500     return ret;
501 }
502 
TestHwcEventCallback(uint32_t devId,uint32_t eventId,const std::vector<int32_t> & eventData,void * data)503 void TestHwcEventCallback(uint32_t devId, uint32_t eventId, const std::vector<int32_t>& eventData, void* data)
504 {
505 }
506 
TestRegHwcEventCallback(uint32_t devId)507 int TestRegHwcEventCallback(uint32_t devId)
508 {
509     int32_t ret = g_composerInterface->RegHwcEventCallback(TestHwcEventCallback, nullptr);
510     if ((ret != DISPLAY_SUCCESS) && (ret != DISPLAY_NOT_SUPPORT)) {
511         HDF_LOGE("%{public}s: failed with ret=%{public}d", __func__, ret);
512     }
513     return ret;
514 }
515 
516 typedef int32_t (*TestFuncs[])(uint32_t);
517 
518 TestFuncs g_testFuncs = {
519     TestSetClientBufferCacheCount,
520     TestGetDisplaySupportedModes,
521     TestSetGetDisplayMode,
522     TestSetGetDisplayPowerStatus,
523     TestPrepareDisplayLayers,
524     TestSetGetDisplayBacklight,
525     TestGetDisplayProperty,
526     TestUpdateHardwareCursor,
527     TestEnableHardwareCursorStats,
528     TestGetHardwareCursorStats,
529     TestGetDisplayCompChange,
530     TestSetDisplayClientCrop,
531     TestSetDisplayClientDamage,
532     TestSetDisplayVsyncEnabled,
533     TestGetDisplayReleaseFence,
534     TestDestroyVirtualDisplay,
535     TestSetVirtualDisplayBuffer,
536     TestSetDisplayProperty,
537     TestGetDisplaySupportedModesExt,
538     TestSetDisplayModeAsync,
539     TestGetDisplayVBlankPeriod,
540     TestRegSeamlessChangeCallback,
541     TestGetSupportedLayerPerFrameParameterKey,
542     TestSetDisplayOverlayResolution,
543     TestRegRefreshCallback,
544     TestGetDisplaySupportedColorGamuts,
545     TestGetHDRCapabilityInfos,
546     TestCommit,
547     TestGetDisplayIdentificationData,
548     TestRegHwcEventCallback,
549 };
550 
FuzzTest(const uint8_t * rawData,size_t size)551 bool FuzzTest(const uint8_t* rawData, size_t size)
552 {
553     if (rawData == nullptr) {
554         return false;
555     }
556 
557     // initialize service
558     if (!g_isInit) {
559         g_isInit = true;
560         g_composerInterface = Composer::V1_3::IDisplayComposerInterface::Get();
561         if (g_composerInterface == nullptr) {
562             HDF_LOGE("%{public}s: get IDisplayComposerInterface failed", __func__);
563             return false;
564         }
565         g_bufferInterface.reset(IDisplayBuffer::Get());
566         if (g_bufferInterface == nullptr) {
567             HDF_LOGE("%{public}s: get IDisplayBuffer failed", __func__);
568             return false;
569         }
570     }
571 
572     // initialize data
573     g_data = rawData;
574     g_dataSize = size;
575     g_pos = 0;
576 
577     uint32_t code = GetData<uint32_t>();
578     uint32_t devId = GetData<uint32_t>();
579     uint32_t len = GetArrLength(g_testFuncs);
580     if (len == 0) {
581         HDF_LOGE("%{public}s: g_testFuncs length is equal to 0", __func__);
582         return false;
583     }
584 
585     int32_t ret = g_testFuncs[code % len](devId);
586     if (ret != DISPLAY_SUCCESS) {
587         HDF_LOGE("function %{public}u failed", code % len);
588         return false;
589     }
590 
591     return true;
592 }
593 } // OHOS
594 
595 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)596 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
597 {
598     if (size < OHOS::THRESHOLD) {
599         return 0;
600     }
601 
602     OHOS::FuzzTest(data, size);
603     return 0;
604 }
605