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 "rsshadow_fuzzer.h"
17
18 #include <climits>
19 #include <cstddef>
20 #include <cstdint>
21 #include <cstdio>
22 #include <cstdlib>
23 #include <fcntl.h>
24 #include <hilog/log.h>
25 #include <securec.h>
26 #include <unistd.h>
27
28 #include "render/rs_shadow.h"
29
30 namespace OHOS {
31 namespace Rosen {
32
33 auto rsShadow = std::make_shared<RSShadow>();
34
35 namespace {
36 const uint8_t* g_data = nullptr;
37 size_t g_size = 0;
38 size_t g_pos;
39 } // namespace
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_size - 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 }
DoSetColor(const uint8_t * data,size_t size)56 bool DoSetColor(const uint8_t* data, size_t size)
57 {
58 if (data == nullptr) {
59 return false;
60 }
61
62 // initialize
63 g_data = data;
64 g_size = size;
65 g_pos = 0;
66
67 uint32_t r = GetData<uint32_t>();
68 uint32_t g = GetData<uint32_t>();
69 uint32_t b = GetData<uint32_t>();
70 uint32_t a = GetData<uint32_t>();
71 RSColor color(r, g, b, a);
72 rsShadow->SetColor(color);
73 return true;
74 }
DoSetOffsetX(const uint8_t * data,size_t size)75 bool DoSetOffsetX(const uint8_t* data, size_t size)
76 {
77 if (data == nullptr) {
78 return false;
79 }
80
81 // initialize
82 g_data = data;
83 g_size = size;
84 g_pos = 0;
85
86 float offsetX = GetData<float>();
87 rsShadow->SetOffsetX(offsetX);
88 return true;
89 }
DoSetOffsetY(const uint8_t * data,size_t size)90 bool DoSetOffsetY(const uint8_t* data, size_t size)
91 {
92 if (data == nullptr) {
93 return false;
94 }
95
96 // initialize
97 g_data = data;
98 g_size = size;
99 g_pos = 0;
100
101 float offsetY = GetData<float>();
102 rsShadow->SetOffsetY(offsetY);
103 return true;
104 }
DoSetAlpha(const uint8_t * data,size_t size)105 bool DoSetAlpha(const uint8_t* data, size_t size)
106 {
107 if (data == nullptr) {
108 return false;
109 }
110
111 // initialize
112 g_data = data;
113 g_size = size;
114 g_pos = 0;
115
116 float alpha = GetData<float>();
117 rsShadow->SetAlpha(alpha);
118 return true;
119 }
DoSetElevation(const uint8_t * data,size_t size)120 bool DoSetElevation(const uint8_t* data, size_t size)
121 {
122 if (data == nullptr) {
123 return false;
124 }
125
126 // initialize
127 g_data = data;
128 g_size = size;
129 g_pos = 0;
130
131 float elevation = GetData<float>();
132 rsShadow->SetElevation(elevation);
133 return true;
134 }
DoSetRadius(const uint8_t * data,size_t size)135 bool DoSetRadius(const uint8_t* data, size_t size)
136 {
137 if (data == nullptr) {
138 return false;
139 }
140
141 // initialize
142 g_data = data;
143 g_size = size;
144 g_pos = 0;
145
146 float radius = GetData<float>();
147 rsShadow->SetRadius(radius);
148 return true;
149 }
DoSetPath(const uint8_t * data,size_t size)150 bool DoSetPath(const uint8_t* data, size_t size)
151 {
152 if (data == nullptr) {
153 return false;
154 }
155
156 // initialize
157 g_data = data;
158 g_size = size;
159 g_pos = 0;
160
161 auto path = std::make_shared<RSPath>();
162 rsShadow->SetPath(path);
163 return true;
164 }
DoSetMask(const uint8_t * data,size_t size)165 bool DoSetMask(const uint8_t* data, size_t size)
166 {
167 if (data == nullptr) {
168 return false;
169 }
170
171 // initialize
172 g_data = data;
173 g_size = size;
174 g_pos = 0;
175
176 bool imageMask = GetData<bool>();
177 rsShadow->SetMask(imageMask);
178 return true;
179 }
DoSetIsFilled(const uint8_t * data,size_t size)180 bool DoSetIsFilled(const uint8_t* data, size_t size)
181 {
182 if (data == nullptr) {
183 return false;
184 }
185
186 // initialize
187 g_data = data;
188 g_size = size;
189 g_pos = 0;
190
191 bool isFilled = GetData<bool>();
192 rsShadow->SetIsFilled(isFilled);
193 return true;
194 }
DoSetColorStrategy(const uint8_t * data,size_t size)195 bool DoSetColorStrategy(const uint8_t* data, size_t size)
196 {
197 if (data == nullptr) {
198 return false;
199 }
200
201 // initialize
202 g_data = data;
203 g_size = size;
204 g_pos = 0;
205
206 int colorStrategy = GetData<int>();
207 rsShadow->SetColorStrategy(colorStrategy);
208 return true;
209 }
DoNoParameter(const uint8_t * data,size_t size)210 bool DoNoParameter(const uint8_t* data, size_t size)
211 {
212 if (data == nullptr) {
213 return false;
214 }
215
216 // initialize
217 g_data = data;
218 g_size = size;
219 g_pos = 0;
220
221 rsShadow->GetColor();
222 rsShadow->GetOffsetX();
223 rsShadow->GetOffsetY();
224 rsShadow->GetAlpha();
225 rsShadow->GetElevation();
226 rsShadow->GetRadius();
227 rsShadow->GetPath();
228 rsShadow->GetMask();
229 rsShadow->GetIsFilled();
230 rsShadow->GetColorStrategy();
231 rsShadow->IsValid();
232 return true;
233 }
234 } // namespace Rosen
235 } // namespace OHOS
236 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)237 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
238 {
239 /* Run your code on data */
240 OHOS::Rosen::DoSetColor(data, size);
241 OHOS::Rosen::DoSetOffsetX(data, size);
242 OHOS::Rosen::DoSetOffsetY(data, size);
243 OHOS::Rosen::DoSetAlpha(data, size);
244 OHOS::Rosen::DoSetElevation(data, size);
245 OHOS::Rosen::DoSetRadius(data, size);
246 OHOS::Rosen::DoSetPath(data, size);
247 OHOS::Rosen::DoSetMask(data, size);
248 OHOS::Rosen::DoSetIsFilled(data, size);
249 OHOS::Rosen::DoSetColorStrategy(data, size);
250 OHOS::Rosen::DoNoParameter(data, size);
251 return 0;
252 }