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