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 }