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 "bufferqueue_fuzzer.h"
17
18 #include <securec.h>
19
20 #include "buffer_queue.h"
21 #include "data_generate.h"
22 #include "surface.h"
23 #include "surface_buffer.h"
24 #include "surface_buffer_impl.h"
25 #include "buffer_extra_data.h"
26 #include "buffer_extra_data_impl.h"
27 #include "sync_fence.h"
28
29 using namespace g_fuzzCommon;
30 namespace OHOS {
GetBufferExtraDataFromData()31 sptr<BufferExtraData> GetBufferExtraDataFromData()
32 {
33 // get data
34 std::string keyInt32 = GetStringFromData(STR_LEN);
35 int32_t valueInt32 = GetData<int32_t>();
36 std::string keyInt64 = GetStringFromData(STR_LEN);
37 int64_t valueInt64 = GetData<int64_t>();
38 std::string keyDouble = GetStringFromData(STR_LEN);
39 double valueDouble = GetData<double>();
40 std::string keyStr = GetStringFromData(STR_LEN);
41 std::string valueStr = GetStringFromData(STR_LEN);
42
43 // test
44 sptr<BufferExtraData> bedata = new BufferExtraDataImpl();
45 bedata->ExtraSet(keyInt32, valueInt32);
46 bedata->ExtraSet(keyInt64, valueInt64);
47 bedata->ExtraSet(keyDouble, valueDouble);
48 bedata->ExtraSet(keyStr, valueStr);
49
50 bedata->ExtraGet(keyInt32, valueInt32);
51 bedata->ExtraGet(keyInt64, valueInt64);
52 bedata->ExtraGet(keyDouble, valueDouble);
53 bedata->ExtraGet(keyStr, valueStr);
54 return bedata;
55 }
56
BufferQueueFuzzTest2()57 void BufferQueueFuzzTest2()
58 {
59 std::string name = GetStringFromData(STR_LEN);
60 uint32_t queueSize = GetData<uint32_t>();
61 int32_t width = GetData<int32_t>();
62 int32_t height = GetData<int32_t>();
63 uint64_t usage = GetData<uint64_t>();
64 uint32_t sequence = GetData<uint32_t>();
65 std::vector<GraphicHDRMetaData> metaData;
66 for (int i = 0; i < 10; i++) { // add 10 elements to the vector
67 GraphicHDRMetaData hDRMetaData = GetData<GraphicHDRMetaData>();
68 metaData.push_back(hDRMetaData);
69 }
70 GraphicHDRMetadataKey key = GetData<GraphicHDRMetadataKey>();
71 std::vector<uint8_t> metaDataSet;
72 for (int i = 0; i < 10; i++) { // add 10 elements to the vector
73 uint8_t metaDataElement = GetData<uint8_t>();
74 metaDataSet.push_back(metaDataElement);
75 }
76 bool flag = GetData<bool>();
77 std::string result = GetStringFromData(STR_LEN);
78 bool status = GetData<bool>();
79 GraphicPresentTimestamp timestamp = GetData<GraphicPresentTimestamp>();
80 OHSurfaceSource sourceType = GetData<OHSurfaceSource>();
81 std::string appFrameworkType = GetStringFromData(STR_LEN);
82 // test
83 sptr<BufferQueue> bufferqueue = new BufferQueue(name);
84 bufferqueue->SetQueueSize(queueSize);
85 bufferqueue->SetDefaultWidthAndHeight(width, height);
86 bufferqueue->SetDefaultUsage(usage);
87 GraphicTransformType transform = GetData<GraphicTransformType >();
88 bufferqueue->SetTransform(transform);
89 bufferqueue->SetMetaData(sequence, metaData);
90 bufferqueue->SetMetaDataSet(sequence, key, metaDataSet);
91 bufferqueue->SetProducerCacheCleanFlag(flag);
92 bufferqueue->Dump(result);
93 bufferqueue->SetStatus(status);
94 bufferqueue->SetPresentTimestamp(sequence, timestamp);
95 bufferqueue->SetSurfaceSourceType(sourceType);
96 bufferqueue->SetSurfaceAppFrameworkType(appFrameworkType);
97 int64_t time = 0;
98 GraphicPresentTimestampType timestampType = GetData<GraphicPresentTimestampType>();
99 bufferqueue->GetPresentTimestamp(sequence, timestampType, time);
100 }
101
BufferQueueFuzzTest1()102 void BufferQueueFuzzTest1()
103 {
104 int32_t timeOut = 0;
105 std::string name = GetStringFromData(STR_LEN);
106 sptr<BufferQueue> bufferqueue = new BufferQueue(name);
107 uint32_t seqNum = GetData<uint32_t>();
108 BufferRequestConfig requestConfig = GetData<BufferRequestConfig>();
109 OHOS::Rect rect = GetData<OHOS::Rect>();
110 int64_t timestamp = GetData<int64_t>();
111 BufferFlushConfigWithDamages flushConfig = {.damages = { rect }, .timestamp = timestamp};
112 uint32_t sequence = GetData<uint32_t>();
113 std::vector<Rect> damages;
114 sptr<OHOS::SurfaceBuffer> buffer = new SurfaceBufferImpl(seqNum);
115 sptr<OHOS::SurfaceBuffer> buffer1 = SurfaceBuffer::Create();
116 sptr<BufferExtraData> bedata = GetBufferExtraDataFromData();
117 IBufferProducer::RequestBufferReturnValue retval;
118 retval.buffer = buffer;
119 bufferqueue->RegisterConsumerListener(nullptr);
120 OnReleaseFunc func;
121 bufferqueue->RegisterReleaseListener(func);
122 OnDeleteBufferFunc deleteBufferFunc;
123 bool isForUniRedraw = GetData<bool>();
124 bufferqueue->RegisterDeleteBufferListener(deleteBufferFunc, isForUniRedraw);
125 bufferqueue->RequestBuffer(requestConfig, bedata, retval);
126 {
127 std::mutex mutex;
128 std::unique_lock<std::mutex> lock(mutex);
129 bufferqueue->ReuseBuffer(requestConfig, bedata, retval, lock);
130 }
131 bufferqueue->CancelBuffer(sequence, bedata);
132 sptr<SyncFence> syncFence = SyncFence::INVALID_FENCE;
133 bufferqueue->FlushBuffer(sequence, bedata, syncFence, flushConfig);
134 bufferqueue->DoFlushBuffer(sequence, bedata, syncFence, flushConfig);
135 bufferqueue->AcquireBuffer(buffer, syncFence, timestamp, damages);
136 bufferqueue->ReleaseBuffer(buffer, syncFence);
137 bufferqueue->AttachBuffer(buffer1, timeOut);
138 bufferqueue->DetachBuffer(buffer1);
139 float matrix[16] = {0};
140 uint32_t matrixSize = GetData<uint32_t>();
141 bool isUseNewMatrix = GetData<bool>();
142 bool needRecordSequence = GetData<bool>();
143 bufferqueue->GetLastFlushedBuffer(buffer, syncFence, matrix, matrixSize, isUseNewMatrix, needRecordSequence);
144 bufferqueue->UnregisterConsumerListener();
145 bufferqueue->UnRegisterProducerReleaseListener();
146 GraphicTransformType transformType = GetData<GraphicTransformType>();
147 bufferqueue->SetTransform(transformType);
148 bufferqueue->GetTransform();
149 uint64_t fromId = GetData<uint64_t>();
150 bufferqueue->SetTransformHint(transformType, fromId);
151 bufferqueue->GetSurfaceSourceType();
152 float brightness = GetData<float>();
153 bufferqueue->SetHdrWhitePointBrightness(brightness);
154 IConsumerSurface::AcquireBufferReturnValue returnValue;
155 int64_t expectPresentTimestamp = GetData<int64_t>();
156 bool isUsingAutoTimestamp = GetData<bool>();
157 bufferqueue->AcquireBuffer(returnValue, expectPresentTimestamp, isUsingAutoTimestamp);
158 bufferqueue->WaitForCondition();
159 bufferqueue->RequestBufferDebugInfoLocked();
160 bufferqueue->CheckProducerCacheListLocked();
161 {
162 std::mutex mutex;
163 std::unique_lock<std::mutex> lock(mutex);
164 bufferqueue->ReallocBufferLocked(requestConfig, retval, lock);
165 }
166 bufferqueue->DelegatorQueueBuffer(sequence, syncFence);
167 bufferqueue->CallConsumerListener();
168 uint64_t uiTimestamp = GetData<uint64_t>();
169 bufferqueue->SetDesiredPresentTimestampAndUiTimestamp(sequence, expectPresentTimestamp, uiTimestamp);
170 int64_t desiredPresentTimestamp = GetData<int64_t>();
171 bufferqueue->IsPresentTimestampReady(desiredPresentTimestamp, expectPresentTimestamp);
172 bufferqueue->ListenerBufferReleasedCb(buffer, syncFence);
173 bufferqueue->OnBufferDeleteCbForHardwareThreadLocked(buffer);
174 {
175 std::mutex mutex;
176 std::unique_lock<std::mutex> lock(mutex);
177 bufferqueue->DeleteBufferInCache(sequence, lock);
178 }
179 sptr<OHOS::SurfaceBuffer> buffer2 = new SurfaceBufferImpl();
180 bufferqueue->SetSurfaceBufferGlobalAlphaUnlocked(buffer2);
181 int32_t alpha;
182 bufferqueue->GetGlobalAlpha(alpha);
183 std::string result;
184 bufferqueue->DumpCache(result);
185 bufferqueue->GetAvailableBufferCount();
186 }
187
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)188 bool DoSomethingInterestingWithMyAPI(const uint8_t* data, size_t size)
189 {
190 if (data == nullptr) {
191 return false;
192 }
193
194 // initialize
195 g_data = data;
196 g_size = size;
197 g_pos = 0;
198 std::string name = GetStringFromData(STR_LEN);
199 sptr<BufferQueue> bufferqueue = new BufferQueue(name);
200 bool cleanAll = GetData<bool>();
201 bufferqueue->CleanCache(cleanAll, nullptr);
202 bufferqueue->GetHdrWhitePointBrightness();
203 bufferqueue->GetUniqueId();
204 bufferqueue->GoBackground();
205 ScalingMode mode = GetData<ScalingMode>();
206 bufferqueue->SetScalingMode(mode);
207 bool bufferHold = GetData<bool>();
208 bufferqueue->SetBufferHold(bufferHold);
209 uint32_t reserveInts = GetData<uint32_t>() % 0x100000; // no more than 0x100000
210 GraphicExtDataHandle *handle = AllocExtDataHandle(reserveInts);
211 sptr<SurfaceTunnelHandle> tunnelHandle = new SurfaceTunnelHandle();
212 tunnelHandle->SetHandle(handle);
213 bufferqueue->SetTunnelHandle(tunnelHandle);
214 FreeExtDataHandle(handle);
215 BufferQueueFuzzTest1();
216 BufferQueueFuzzTest2();
217
218 return true;
219 }
220 }
221
222 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)223 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
224 {
225 /* Run your code on data */
226 OHOS::DoSomethingInterestingWithMyAPI(data, size);
227 return 0;
228 }
229
230