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 "windowutilmath_fuzzer.h"
17
18 #include <securec.h>
19
20 #include "display_manager.h"
21 #include "window.h"
22 #include "window_manager.h"
23 #include "window_scene.h"
24 #include "wm_math.h"
25
26 using namespace OHOS::Rosen;
27 using namespace OHOS::Rosen::TransformHelper;
28
29 namespace OHOS {
30 namespace {
31 constexpr size_t DATA_MIN_SIZE = 2;
32 }
33
34 template<class T>
GetObject(T & object,const uint8_t * data,size_t size)35 size_t GetObject(T& object, const uint8_t* data, size_t size)
36 {
37 size_t objectSize = sizeof(object);
38 if (objectSize > size) {
39 return 0;
40 }
41 return memcpy_s(&object, objectSize, data, objectSize) == EOK ? objectSize : 0;
42 }
43
InitMatrix3(OHOS::Rosen::TransformHelper::Matrix3 & mat3,const uint8_t * data,size_t size,size_t startPos)44 size_t InitMatrix3(OHOS::Rosen::TransformHelper::Matrix3& mat3,
45 const uint8_t* data, size_t size, size_t startPos)
46 {
47 if (data == nullptr || size < DATA_MIN_SIZE) {
48 return 0;
49 }
50 const int maxRow = 3;
51 const int maxCol = 3;
52 for (int i = 0; i < maxRow; i++) {
53 for (int j = 0; j < maxCol; j++) {
54 startPos += GetObject<float>(mat3.mat_[i][j], data + startPos, size - startPos);
55 }
56 }
57 return startPos;
58 }
59
InitMatrix4(OHOS::Rosen::TransformHelper::Matrix4 & mat4,const uint8_t * data,size_t size,size_t & startPos)60 void InitMatrix4(OHOS::Rosen::TransformHelper::Matrix4& mat4,
61 const uint8_t* data, size_t size, size_t& startPos)
62 {
63 if (data == nullptr || size < DATA_MIN_SIZE) {
64 return;
65 }
66 const int maxRow = 4;
67 const int maxCol = 4;
68 for (int i = 0; i < maxRow; i++) {
69 for (int j = 0; j < maxCol; j++) {
70 startPos += GetObject<float>(mat4.mat_[i][j], data + startPos, size - startPos);
71 }
72 }
73 }
74
InitVector2(OHOS::Rosen::TransformHelper::Vector2 & vec2,const uint8_t * data,size_t size,size_t & startPos)75 void InitVector2(OHOS::Rosen::TransformHelper::Vector2& vec2,
76 const uint8_t* data, size_t size, size_t& startPos)
77 {
78 if (data == nullptr || size < DATA_MIN_SIZE) {
79 return;
80 }
81 startPos += GetObject<float>(vec2.x_, data + startPos, size - startPos);
82 startPos += GetObject<float>(vec2.y_, data + startPos, size - startPos);
83 }
84
InitVector3(OHOS::Rosen::TransformHelper::Vector3 & vec3,const uint8_t * data,size_t size,size_t & startPos)85 void InitVector3(OHOS::Rosen::TransformHelper::Vector3& vec3,
86 const uint8_t* data, size_t size, size_t& startPos)
87 {
88 if (data == nullptr || size < DATA_MIN_SIZE) {
89 return;
90 }
91 startPos += GetObject<float>(vec3.x_, data + startPos, size - startPos);
92 startPos += GetObject<float>(vec3.y_, data + startPos, size - startPos);
93 startPos += GetObject<float>(vec3.y_, data + startPos, size - startPos);
94 }
95
WindowUtilMathFuzzPart1(const uint8_t * data,size_t size)96 void WindowUtilMathFuzzPart1(const uint8_t* data, size_t size)
97 {
98 if (data == nullptr || size < DATA_MIN_SIZE) {
99 return;
100 }
101 size_t startPos = 0;
102 OHOS::Rosen::TransformHelper::Matrix3 left3;
103 OHOS::Rosen::TransformHelper::Matrix3 right3;
104 InitMatrix3(left3, data, size, startPos);
105 InitMatrix3(right3, data, size, startPos);
106 OHOS::Rosen::TransformHelper::Matrix3 result = left3 * right3;
107 left3 *= right3;
108
109 OHOS::Rosen::TransformHelper::Matrix4 left4;
110 OHOS::Rosen::TransformHelper::Matrix4 right4;
111 InitMatrix4(left4, data, size, startPos);
112 InitMatrix4(right4, data, size, startPos);
113 OHOS::Rosen::TransformHelper::Matrix4 result2 = left4 * right4;
114 left4 *= right4;
115 left4.Invert();
116 left4.GetScale();
117 left4.GetTranslation();
118
119 float theta;
120 startPos += GetObject<float>(theta, data + startPos, size - startPos);
121 OHOS::Rosen::TransformHelper::CreateRotation(theta);
122 OHOS::Rosen::TransformHelper::CreateRotationX(theta);
123 OHOS::Rosen::TransformHelper::CreateRotationY(theta);
124 OHOS::Rosen::TransformHelper::CreateRotationZ(theta);
125
126 OHOS::Rosen::TransformHelper::Vector3 scaleVec;
127 InitVector3(scaleVec, data, size, startPos);
128 OHOS::Rosen::TransformHelper::CreateScale(scaleVec.x_, scaleVec.y_);
129 OHOS::Rosen::TransformHelper::CreateScale(scaleVec.x_, scaleVec.y_, scaleVec.z_);
130
131 OHOS::Rosen::TransformHelper::Vector2 vec2;
132 InitVector2(vec2, data, size, startPos);
133 OHOS::Rosen::TransformHelper::CreateTranslation(vec2);
134
135 OHOS::Rosen::TransformHelper::Vector3 vec3;
136 InitVector3(vec3, data, size, startPos);
137 OHOS::Rosen::TransformHelper::CreateTranslation(vec3);
138 }
139
WindowUtilMathFuzzPart2(const uint8_t * data,size_t size)140 void WindowUtilMathFuzzPart2(const uint8_t* data, size_t size)
141 {
142 if (data == nullptr || size < DATA_MIN_SIZE) {
143 return;
144 }
145 size_t startPos = 0;
146
147 OHOS::Rosen::TransformHelper::Vector3 eye, target, up;
148 InitVector3(eye, data, size, startPos);
149 InitVector3(target, data, size, startPos);
150 InitVector3(up, data, size, startPos);
151 OHOS::Rosen::TransformHelper::CreateLookAt(eye, target, up);
152
153 OHOS::Rosen::TransformHelper::CreatePerspective(eye);
154
155 OHOS::Rosen::TransformHelper::Matrix3 mat3;
156 InitMatrix3(mat3, data, size, startPos);
157 OHOS::Rosen::TransformHelper::Vector2 vec2;
158 InitVector2(vec2, data, size, startPos);
159 OHOS::Rosen::TransformHelper::Transform(vec2, mat3);
160
161 OHOS::Rosen::TransformHelper::Matrix4 mat4;
162 InitMatrix4(mat4, data, size, startPos);
163 OHOS::Rosen::TransformHelper::Vector3 vec3;
164 InitVector3(vec3, data, size, startPos);
165 OHOS::Rosen::TransformHelper::Transform(vec3, mat4);
166 float w;
167 startPos += GetObject<float>(w, data + startPos, size - startPos);
168 OHOS::Rosen::TransformHelper::TransformWithPerspDiv(vec3, mat4, w);
169 OHOS::Rosen::TransformHelper::GetOriginScreenPoint(vec2, mat4);
170 }
171
DoWindowUtilMathFuzzTest(const uint8_t * data,size_t size)172 bool DoWindowUtilMathFuzzTest(const uint8_t* data, size_t size)
173 {
174 if (data == nullptr || size < DATA_MIN_SIZE) {
175 return false;
176 }
177 WindowUtilMathFuzzPart1(data, size);
178 WindowUtilMathFuzzPart2(data, size);
179 return true;
180 }
181 } // namespace.OHOS
182
183 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)184 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
185 {
186 /* Run your code on data */
187 OHOS::DoWindowUtilMathFuzzTest(data, size);
188 return 0;
189 }
190
191