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 <parcel.h>
17
18 #include <securec.h>
19
20 #include "marshalling_helper.h"
21 #include "window_manager.h"
22
23 using namespace OHOS::Rosen;
24
25 namespace OHOS {
26 namespace {
27 constexpr size_t DATA_MIN_SIZE = 2;
28 }
29
30 template<class T>
GetObject(T & object,const uint8_t * data,size_t size)31 size_t GetObject(T &object, const uint8_t *data, size_t size)
32 {
33 size_t objectSize = sizeof(object);
34 if (objectSize > size) {
35 return 0;
36 }
37 return memcpy_s(&object, objectSize, data, objectSize) == EOK ? objectSize : 0;
38 }
39
40 class FocusChangedListener : public IFocusChangedListener {
41 public:
OnFocused(const sptr<FocusChangeInfo> & focusChangeInfo)42 virtual void OnFocused(const sptr<FocusChangeInfo>& focusChangeInfo) override
43 {
44 }
45
OnUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)46 virtual void OnUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo) override
47 {
48 }
49 };
50
51 class SystemBarChangedListener : public ISystemBarChangedListener {
52 public:
OnSystemBarPropertyChange(DisplayId displayId,const SystemBarRegionTints & tints)53 virtual void OnSystemBarPropertyChange(DisplayId displayId, const SystemBarRegionTints& tints) override
54 {
55 }
56 };
57
58 class VisibilityChangedListener : public IVisibilityChangedListener {
59 public:
OnWindowVisibilityChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfo)60 virtual void OnWindowVisibilityChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfo) override
61 {
62 }
63 };
64
65 class WindowUpdateListener : public IWindowUpdateListener {
66 public:
OnWindowUpdate(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type)67 virtual void OnWindowUpdate(const std::vector<sptr<AccessibilityWindowInfo>>& infos, WindowUpdateType type) override
68 {
69 }
70 };
71
72 class CameraFloatWindowChangedListener : public ICameraFloatWindowChangedListener {
73 public:
OnCameraFloatWindowChange(uint32_t accessTokenId,bool isShowing)74 void OnCameraFloatWindowChange(uint32_t accessTokenId, bool isShowing) override
75 {
76 }
77 };
78
79 class WaterMarkFlagChangedListener : public IWaterMarkFlagChangedListener {
80 public:
OnWaterMarkFlagUpdate(bool showWaterMark)81 void OnWaterMarkFlagUpdate(bool showWaterMark) override
82 {
83 }
84 };
85
86 class GestureNavigationEnabledChangedListener : public IGestureNavigationEnabledChangedListener {
87 public:
OnGestureNavigationEnabledUpdate(bool enable)88 void OnGestureNavigationEnabledUpdate(bool enable) override
89 {
90 }
91 };
92
DoSomethingForWindowManagerImpl(WindowManager & windowManager,const uint8_t * data,size_t size)93 bool DoSomethingForWindowManagerImpl(WindowManager& windowManager, const uint8_t* data, size_t size)
94 {
95 if (data == nullptr || size < DATA_MIN_SIZE) {
96 return false;
97 }
98 size_t startPos = 0;
99 uint32_t accessTokenId;
100 bool isShowing;
101 startPos += GetObject<uint32_t>(accessTokenId, data + startPos, size - startPos);
102 startPos += GetObject<bool>(isShowing, data + startPos, size - startPos);
103 windowManager.UpdateCameraFloatWindowStatus(accessTokenId, isShowing);
104 bool enable;
105 startPos += GetObject<bool>(enable, data + startPos, size - startPos);
106 windowManager.SetGestureNavigaionEnabled(enable);
107
108 DisplayId displayId;
109 SystemBarRegionTints tints;
110 startPos += GetObject<DisplayId>(displayId, data + startPos, size - startPos);
111 GetObject<SystemBarRegionTints>(tints, data + startPos, size - startPos);
112 windowManager.UpdateSystemBarRegionTints(displayId, tints);
113
114 return true;
115 }
116
CheckAccessibilityWindowInfo(WindowManager & windowManager,const uint8_t * data,size_t size)117 void CheckAccessibilityWindowInfo(WindowManager& windowManager, const uint8_t* data, size_t size)
118 {
119 Parcel accessibilityWindowInfosParcel;
120 if (accessibilityWindowInfosParcel.WriteBuffer(data, size)) {
121 std::vector<sptr<AccessibilityWindowInfo>> windowInfos;
122 MarshallingHelper::UnmarshallingVectorParcelableObj<AccessibilityWindowInfo>(accessibilityWindowInfosParcel,
123 windowInfos);
124 windowManager.GetAccessibilityWindowInfo(windowInfos);
125 WindowUpdateType type;
126 GetObject<WindowUpdateType>(type, data, size);
127 windowManager.NotifyAccessibilityWindowInfo(windowInfos, type);
128 }
129
130 Parcel windowVisibilityInfosParcel;
131 windowVisibilityInfosParcel.WriteBuffer(data, size);
132 std::vector<sptr<WindowVisibilityInfo>> visibilitynfos;
133 MarshallingHelper::UnmarshallingVectorParcelableObj<WindowVisibilityInfo>(windowVisibilityInfosParcel,
134 visibilitynfos);
135 windowManager.GetVisibilityWindowInfo(visibilitynfos);
136 windowManager.UpdateWindowVisibilityInfo(visibilitynfos);
137 bool enable = false;
138 windowManager.SetGestureNavigaionEnabled(enable);
139 }
140
DoSomethingInterestingWithMyAPI(const uint8_t * data,size_t size)141 bool DoSomethingInterestingWithMyAPI(const uint8_t* data, size_t size)
142 {
143 if (data == nullptr || size < DATA_MIN_SIZE) {
144 return false;
145 }
146 WindowManager& windowManager = WindowManager::GetInstance();
147 CheckAccessibilityWindowInfo(windowManager, data, size);
148 Parcel focusChangeInfoParcel;
149 if (focusChangeInfoParcel.WriteBuffer(data, size)) {
150 FocusChangeInfo::Unmarshalling(focusChangeInfoParcel);
151 }
152 Parcel parcel;
153 sptr<FocusChangeInfo> focusChangeInfo = new FocusChangeInfo();
154 focusChangeInfo->Marshalling(parcel);
155 Parcel windowVisibilityInfoParcel;
156 if (windowVisibilityInfoParcel.WriteBuffer(data, size)) {
157 WindowVisibilityInfo::Unmarshalling(windowVisibilityInfoParcel);
158 }
159 sptr<WindowVisibilityInfo> windowVisibilityInfo = new WindowVisibilityInfo();
160 windowVisibilityInfo->Marshalling(parcel);
161 Parcel accessibilityWindowInfoParcel;
162 if (accessibilityWindowInfoParcel.WriteBuffer(data, size)) {
163 AccessibilityWindowInfo::Unmarshalling(accessibilityWindowInfoParcel);
164 }
165 sptr<AccessibilityWindowInfo> accessibilityWindowInfo = new AccessibilityWindowInfo();
166 accessibilityWindowInfo->Marshalling(parcel);
167 windowManager.MinimizeAllAppWindows(static_cast<DisplayId>(data[0]));
168 sptr<IFocusChangedListener> focusChangedListener = new FocusChangedListener();
169 windowManager.RegisterFocusChangedListener(focusChangedListener);
170 sptr<ISystemBarChangedListener> systemBarChangedListener = new SystemBarChangedListener();
171 windowManager.RegisterSystemBarChangedListener(systemBarChangedListener);
172 sptr<IVisibilityChangedListener> visibilityChangedListener = new VisibilityChangedListener();
173 windowManager.RegisterVisibilityChangedListener(visibilityChangedListener);
174 sptr<IWindowUpdateListener> windowUpdateListener = new WindowUpdateListener();
175 windowManager.RegisterWindowUpdateListener(windowUpdateListener);
176 sptr<ICameraFloatWindowChangedListener> cameraFloatWindowChanagedListener = new CameraFloatWindowChangedListener();
177 windowManager.RegisterCameraFloatWindowChangedListener(cameraFloatWindowChanagedListener);
178 windowManager.SetWindowLayoutMode(static_cast<WindowLayoutMode>(data[0]));
179 windowManager.UnregisterFocusChangedListener(focusChangedListener);
180 windowManager.UnregisterSystemBarChangedListener(systemBarChangedListener);
181 windowManager.UnregisterVisibilityChangedListener(visibilityChangedListener);
182 windowManager.UnregisterWindowUpdateListener(windowUpdateListener);
183 windowManager.UnregisterCameraFloatWindowChangedListener(cameraFloatWindowChanagedListener);
184 sptr<IWaterMarkFlagChangedListener> waterMarkFlagChangedListener = new WaterMarkFlagChangedListener();
185 windowManager.RegisterWaterMarkFlagChangedListener(waterMarkFlagChangedListener);
186 windowManager.UnregisterWaterMarkFlagChangedListener(waterMarkFlagChangedListener);
187 sptr<IGestureNavigationEnabledChangedListener> gestureListener = new GestureNavigationEnabledChangedListener();
188 windowManager.RegisterGestureNavigationEnabledChangedListener(gestureListener);
189 windowManager.UnregisterGestureNavigationEnabledChangedListener(gestureListener);
190 return true;
191 }
192 } // namespace.OHOS
193
194 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)195 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
196 {
197 /* Run your code on data */
198 OHOS::DoSomethingInterestingWithMyAPI(data, size);
199 return 0;
200 }
201
202