• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <fcntl.h>
17 #include <fuzzer/FuzzedDataProvider.h>
18 #include <sys/stat.h>
19 #include <unistd.h>
20 
21 #include <cstdint>
22 #include <cstdio>
23 #include <iostream>
24 
25 #include "accesstoken_kit.h"
26 #include "nativetoken_kit.h"
27 #include "pixel_map.h"
28 #include "token_setproc.h"
29 #include "wallpaper_common.h"
30 #include "wallpaper_manager.h"
31 #include "wallpaper_manager_client.h"
32 #include "wallpaper_manager_common_info.h"
33 #include "wallpaper_picture_info_by_parcel.h"
34 #include "wallpaper_rawdata.h"
35 
36 using namespace OHOS::Security::AccessToken;
37 using namespace OHOS::Media;
38 
39 namespace OHOS {
40 constexpr const char *WALLPAPER_DEFAULT_FILEFULLPATH = "/system/etc/wallpaperdefault.jpeg";
41 constexpr int32_t PIXELMAP_SIZE = 100;
42 static const char *g_perms[2] = { "ohos.permission.GET_WALLPAPER", "ohos.permission.SET_WALLPAPER" };
GrantNativePermission()43 void GrantNativePermission()
44 {
45     TokenInfoParams infoInstance = {
46         .dcapsNum = 0,
47         .permsNum = 2,
48         .aclsNum = 0,
49         .dcaps = nullptr,
50         .perms = g_perms,
51         .acls = nullptr,
52         .processName = "wallpaper_service",
53         .aplStr = "system_core",
54     };
55     uint64_t tokenId = GetAccessTokenId(&infoInstance);
56     SetSelfTokenID(tokenId);
57     AccessTokenKit::ReloadNativeTokenInfo();
58 }
59 
60 class WallpaperEventListenerFuzzTestImpl : public OHOS::WallpaperMgrService::WallpaperEventListener {
61 public:
62     std::vector<uint64_t> color_;
63     int32_t wallpaperType_;
64     WallpaperEventListenerFuzzTestImpl();
~WallpaperEventListenerFuzzTestImpl()65     ~WallpaperEventListenerFuzzTestImpl()
66     {
67     }
68 
69     WallpaperEventListenerFuzzTestImpl(const WallpaperEventListenerFuzzTestImpl &) = delete;
70     WallpaperEventListenerFuzzTestImpl &operator=(const WallpaperEventListenerFuzzTestImpl &) = delete;
71     WallpaperEventListenerFuzzTestImpl(WallpaperEventListenerFuzzTestImpl &&) = delete;
72     WallpaperEventListenerFuzzTestImpl &operator=(WallpaperEventListenerFuzzTestImpl &&) = delete;
73 
74     // callback function will be called when the db data is changed.
75     void OnColorsChange(const std::vector<uint64_t> &color, int32_t wallpaperType);
76 
77 private:
78     unsigned long callCount_;
79 };
80 
OnColorsChange(const std::vector<uint64_t> & color,int32_t wallpaperType)81 void WallpaperEventListenerFuzzTestImpl::OnColorsChange(const std::vector<uint64_t> &color, int32_t wallpaperType)
82 {
83     callCount_++;
84     std::copy(color.begin(), color.end(), std::back_inserter(color_));
85     wallpaperType_ = wallpaperType;
86 }
87 
WallpaperEventListenerFuzzTestImpl()88 WallpaperEventListenerFuzzTestImpl::WallpaperEventListenerFuzzTestImpl() : wallpaperType_(-1), callCount_(0)
89 {
90 }
91 
GetColorsFuzzTest(FuzzedDataProvider & provider)92 void GetColorsFuzzTest(FuzzedDataProvider &provider)
93 {
94     GrantNativePermission();
95     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
96     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
97     std::vector<uint64_t> colors;
98     WallpaperMgrService::WallpaperManager::GetInstance().GetColors(wallpaperType, apiInfo, colors);
99 }
100 
GetWallpaperIdFuzzTest(FuzzedDataProvider & provider)101 void GetWallpaperIdFuzzTest(FuzzedDataProvider &provider)
102 {
103     GrantNativePermission();
104     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
105     WallpaperMgrService::WallpaperManager::GetInstance().GetWallpaperId(wallpaperType);
106 }
107 
ResetWallpaperFuzzTest(FuzzedDataProvider & provider)108 void ResetWallpaperFuzzTest(FuzzedDataProvider &provider)
109 {
110     GrantNativePermission();
111     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
112     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
113     WallpaperMgrService::WallpaperManager::GetInstance().ResetWallpaper(wallpaperType, apiInfo);
114 }
115 
SetWallpaperByUriFuzzTest(FuzzedDataProvider & provider)116 void SetWallpaperByUriFuzzTest(FuzzedDataProvider &provider)
117 {
118     GrantNativePermission();
119     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
120     std::string uri = provider.ConsumeRandomLengthString();
121     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
122     auto listener = std::make_shared<WallpaperEventListenerFuzzTestImpl>();
123     WallpaperMgrService::WallpaperManager::GetInstance().On("colorChange", listener);
124     WallpaperMgrService::WallpaperManager::GetInstance().SetWallpaper(uri, wallpaperType, apiInfo);
125     WallpaperMgrService::WallpaperManager::GetInstance().Off("colorChange", listener);
126     WallpaperMgrService::WallpaperManager::GetInstance().SetWallpaper(
127         std::string(WALLPAPER_DEFAULT_FILEFULLPATH), wallpaperType, apiInfo);
128 }
129 
SetWallpaperByMapFuzzTest(FuzzedDataProvider & provider)130 void SetWallpaperByMapFuzzTest(FuzzedDataProvider &provider)
131 {
132     GrantNativePermission();
133     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
134     uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
135     InitializationOptions opts = { { 5, 7 }, OHOS::Media::PixelFormat::ARGB_8888 };
136     std::unique_ptr<PixelMap> uniquePixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
137     std::shared_ptr<PixelMap> pixelMap = std::move(uniquePixelMap);
138     auto listener = std::make_shared<WallpaperEventListenerFuzzTestImpl>();
139     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
140     WallpaperMgrService::WallpaperManager::GetInstance().On("colorChange", listener);
141     WallpaperMgrService::WallpaperManager::GetInstance().SetWallpaper(pixelMap, wallpaperType, apiInfo);
142     WallpaperMgrService::WallpaperManager::GetInstance().Off("colorChange", listener);
143 }
144 
GetFileFuzzTest(FuzzedDataProvider & provider)145 void GetFileFuzzTest(FuzzedDataProvider &provider)
146 {
147     GrantNativePermission();
148     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
149     int32_t wallpaperFd = -1;
150     WallpaperMgrService::WallpaperManager::GetInstance().GetFile(wallpaperType, wallpaperFd);
151 }
152 
WallpaperManagerFuzzTest(FuzzedDataProvider & provider)153 void WallpaperManagerFuzzTest(FuzzedDataProvider &provider)
154 {
155     GrantNativePermission();
156     auto minHeight = provider.ConsumeIntegral<int32_t>();
157     auto minWidth = provider.ConsumeIntegral<int32_t>();
158     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
159     WallpaperMgrService::WallpaperManager::GetInstance().GetWallpaperMinHeight(apiInfo, minHeight);
160     WallpaperMgrService::WallpaperManager::GetInstance().GetWallpaperMinWidth(apiInfo, minWidth);
161     WallpaperMgrService::WallpaperManager::GetInstance().IsChangePermitted();
162     WallpaperMgrService::WallpaperManager::GetInstance().IsOperationAllowed();
163     uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
164     InitializationOptions opts = { { 5, 7 }, OHOS::Media::PixelFormat::ARGB_8888 };
165     std::unique_ptr<PixelMap> uniquePixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
166     std::shared_ptr<PixelMap> pixelMap = std::move(uniquePixelMap);
167     int32_t size = provider.ConsumeIntegral<int32_t>();
168     int32_t fd = provider.ConsumeIntegral<int32_t>();
169     WallpaperMgrService::WallpaperManager::GetInstance().CreatePixelMapByFd(fd, size, pixelMap);
170     WallpaperMgrService::WallpaperManager::GetInstance().GetCallback();
171     FaultType faultType = FaultType::SERVICE_FAULT;
172     FaultCode FaultCode = FaultCode::SF_SERVICE_UNAVAILABLE;
173     WallpaperMgrService::WallpaperManager::GetInstance().ReporterFault(faultType, FaultCode);
174     int32_t wallpaperType = provider.ConsumeIntegral<int32_t>();
175     WallpaperMgrService::WallpaperManager::GetInstance().CloseWallpaperFd(wallpaperType);
176     WallpaperMgrService::WallpaperManager::GetInstance().RegisterWallpaperListener();
177     std::string fileName = provider.ConsumeRandomLengthString();
178     WallpaperMgrService::WallpaperManager::GetInstance().CheckVideoFormat(fileName);
179     int64_t fileSize;
180     int32_t fdVedio;
181     WallpaperMgrService::WallpaperManager::GetInstance().OpenFile(fileName, fdVedio, fileSize);
182     long fdLength;
183     bool idLive = provider.ConsumeBool();
184     WallpaperMgrService::WallpaperManager::GetInstance().CheckWallpaperFormat(fileName, idLive, fdLength);
185     WallpaperInfo wallpaperInfo;
186     wallpaperInfo.foldState = FoldState::NORMAL;
187     wallpaperInfo.rotateState = RotateState::PORT;
188     wallpaperInfo.source = provider.ConsumeRandomLengthString();
189     WallpaperMgrService::WallpaperPictureInfo wallpaperPictureInfo;
190     wallpaperPictureInfo.foldState = FoldState::NORMAL;
191     wallpaperPictureInfo.rotateState = RotateState::PORT;
192     wallpaperPictureInfo.fd = fd;
193     wallpaperPictureInfo.length = provider.ConsumeIntegral<long>();
194     WallpaperMgrService::WallpaperManager::GetInstance().GetFdByPath(wallpaperInfo, wallpaperPictureInfo, fileName);
195     WallpaperMgrService::WallpaperManager::GetInstance().ConverString2Int(fileName);
196 }
197 
GetPixelMapFuzzTest(FuzzedDataProvider & provider)198 void GetPixelMapFuzzTest(FuzzedDataProvider &provider)
199 {
200     GrantNativePermission();
201     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
202     std::shared_ptr<OHOS::Media::PixelMap> pixelMap;
203     WallpaperMgrService::ApiInfo apiInfo{ provider.ConsumeBool(), provider.ConsumeBool() };
204     WallpaperMgrService::WallpaperManager::GetInstance().GetPixelMap(wallpaperType, apiInfo, pixelMap);
205 }
206 
SetVideoFuzzTest(FuzzedDataProvider & provider)207 void SetVideoFuzzTest(FuzzedDataProvider &provider)
208 {
209     GrantNativePermission();
210     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
211     std::string uri = provider.ConsumeRandomLengthString();
212     WallpaperMgrService::WallpaperManager::GetInstance().SetVideo(uri, wallpaperType);
213     WallpaperMgrService::WallpaperManager::GetInstance().SetVideo(
214         std::string(WALLPAPER_DEFAULT_FILEFULLPATH), wallpaperType);
215 }
216 
SendEventFuzzTest(FuzzedDataProvider & provider)217 void SendEventFuzzTest(FuzzedDataProvider &provider)
218 {
219     GrantNativePermission();
220     std::string eventType = provider.ConsumeRandomLengthString();
221     WallpaperMgrService::WallpaperManager::GetInstance().SendEvent(eventType);
222 }
223 
SetCustomWallpaperFuzzTest(FuzzedDataProvider & provider)224 void SetCustomWallpaperFuzzTest(FuzzedDataProvider &provider)
225 {
226     GrantNativePermission();
227     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
228     std::string uri = provider.ConsumeRandomLengthString();
229     WallpaperMgrService::WallpaperManager::GetInstance().SetCustomWallpaper(uri, wallpaperType);
230     WallpaperMgrService::WallpaperManager::GetInstance().SetCustomWallpaper(
231         std::string(WALLPAPER_DEFAULT_FILEFULLPATH), wallpaperType);
232 }
233 
SetAllWallpapersFuzzTest(FuzzedDataProvider & provider)234 void SetAllWallpapersFuzzTest(FuzzedDataProvider &provider)
235 {
236     GrantNativePermission();
237     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
238     std::vector<WallpaperInfo> allWallpaperInfos;
239     WallpaperInfo wallpaperInfo;
240     wallpaperInfo.foldState = FoldState::NORMAL;
241     wallpaperInfo.rotateState = RotateState::PORT;
242     wallpaperInfo.source = provider.ConsumeRandomLengthString();
243     allWallpaperInfos.push_back(wallpaperInfo);
244     WallpaperMgrService::WallpaperManager::GetInstance().SetAllWallpapers(allWallpaperInfos, wallpaperType);
245     allWallpaperInfos.clear();
246     wallpaperInfo.source = std::string(WALLPAPER_DEFAULT_FILEFULLPATH);
247     allWallpaperInfos.push_back(wallpaperInfo);
248     WallpaperMgrService::WallpaperManager::GetInstance().SetAllWallpapers(allWallpaperInfos, wallpaperType);
249 }
250 
GetCorrespondWallpaperFuzzTest(FuzzedDataProvider & provider)251 void GetCorrespondWallpaperFuzzTest(FuzzedDataProvider &provider)
252 {
253     GrantNativePermission();
254     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
255     std::shared_ptr<OHOS::Media::PixelMap> pixelMap;
256     WallpaperMgrService::WallpaperManager::GetInstance().GetCorrespondWallpaper(
257         wallpaperType, FoldState::NORMAL, RotateState::PORT, pixelMap);
258 }
259 
IsDefaultWallpaperResourceFuzzTest(FuzzedDataProvider & provider)260 void IsDefaultWallpaperResourceFuzzTest(FuzzedDataProvider &provider)
261 {
262     GrantNativePermission();
263     uint32_t userId = provider.ConsumeIntegral<uint32_t>();
264     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
265     WallpaperMgrService::WallpaperManagerClient::GetInstance().IsDefaultWallpaperResource(userId, wallpaperType);
266     WallpaperMgrService::WallpaperManager::GetInstance().IsDefaultWallpaperResource(userId, wallpaperType);
267 }
268 
SetAllWallpapersClientFuzzTest(FuzzedDataProvider & provider)269 void SetAllWallpapersClientFuzzTest(FuzzedDataProvider &provider)
270 {
271     GrantNativePermission();
272     uint32_t wallpaperType = provider.ConsumeIntegral<uint32_t>();
273     std::vector<WallpaperInfo> allWallpaperInfos;
274     WallpaperInfo wallpaperInfo;
275     wallpaperInfo.foldState = FoldState::NORMAL;
276     wallpaperInfo.rotateState = RotateState::PORT;
277     wallpaperInfo.source = provider.ConsumeRandomLengthString();
278     allWallpaperInfos.push_back(wallpaperInfo);
279     WallpaperMgrService::WallpaperManagerClient::GetInstance().SetAllWallpapers(allWallpaperInfos, wallpaperType);
280     wallpaperType = 0;
281     WallpaperMgrService::WallpaperManagerClient::GetInstance().SetAllWallpapers(allWallpaperInfos, wallpaperType);
282     WallpaperMgrService::WallpaperManager::GetInstance().SetAllWallpapers(allWallpaperInfos, wallpaperType);
283 }
284 
WallpaperManagerProxyFuzzTest(FuzzedDataProvider & provider)285 void WallpaperManagerProxyFuzzTest(FuzzedDataProvider &provider)
286 {
287     auto wallpaperProxy = WallpaperMgrService::WallpaperManager::GetInstance().GetService();
288     int32_t fd = provider.ConsumeIntegral<int32_t>();
289     int32_t wallpaperType = provider.ConsumeIntegral<int32_t>();
290     long length = provider.ConsumeIntegral<long>();
291     wallpaperProxy->SetWallpaperV9(fd, wallpaperType, length);
292     wallpaperProxy->SetWallpaper(fd, wallpaperType, length);
293     wallpaperProxy->SetVideo(fd, wallpaperType, length);
294     wallpaperProxy->SetCustomWallpaper(fd, wallpaperType, length);
295 
296     std::vector<int8_t> value = provider.ConsumeBytes<int8_t>(PIXELMAP_SIZE);
297     WallpaperMgrService::WallpaperRawData wallpaperRawData;
298     wallpaperRawData.size = value.size();
299     wallpaperRawData.data = value.data();
300     wallpaperProxy->SetWallpaperByPixelMap(wallpaperRawData, wallpaperType);
301     wallpaperProxy->SetWallpaperV9ByPixelMap(wallpaperRawData, wallpaperType);
302 
303     int32_t pixelmapSize;
304     int32_t pixelmapFd;
305     wallpaperProxy->GetPixelMapV9(wallpaperType, pixelmapSize, pixelmapFd);
306     wallpaperProxy->GetPixelMap(wallpaperType, pixelmapSize, pixelmapFd);
307     WallpaperMgrService::WallpaperPictureInfoByParcel wallpaperPictureInfoByParcel;
308 
309     WallpaperMgrService::WallpaperPictureInfo wallpaperPictureInfo;
310     wallpaperPictureInfo.foldState = FoldState::NORMAL;
311     wallpaperPictureInfo.rotateState = RotateState::PORT;
312     wallpaperPictureInfo.fd = fd;
313     wallpaperPictureInfo.length = length;
314     wallpaperPictureInfoByParcel.wallpaperPictureInfo_.push_back(wallpaperPictureInfo);
315     std::vector<int32_t> fdVector;
316     fdVector.push_back(fd);
317     wallpaperProxy->SetAllWallpapers(wallpaperPictureInfoByParcel, wallpaperType, fdVector);
318 
319     int32_t foldState = 0;
320     int32_t rotateState = 0;
321     wallpaperProxy->GetCorrespondWallpaper(wallpaperType, foldState, rotateState, pixelmapSize, pixelmapFd);
322 }
323 
WallpaperManagerCallbackFuzzTest(FuzzedDataProvider & provider)324 void WallpaperManagerCallbackFuzzTest(FuzzedDataProvider &provider)
325 {
326     GrantNativePermission();
327     uint32_t color[100] = { 3, 7, 9, 9, 7, 6 };
328     InitializationOptions opts = { { 5, 7 }, OHOS::Media::PixelFormat::ARGB_8888 };
329     std::unique_ptr<PixelMap> uniquePixelMap = PixelMap::Create(color, sizeof(color) / sizeof(color[0]), opts);
330     std::shared_ptr<PixelMap> pixelMap = std::move(uniquePixelMap);
331     int32_t size = provider.ConsumeIntegral<int32_t>();
332     int32_t fd = provider.ConsumeIntegral<int32_t>();
333     WallpaperMgrService::WallpaperManager::GetInstance().CreatePixelMapByFd(fd, size, pixelMap);
334     std::string wallpaperPath = "/data/service/el1/public/wallpaper/100/system/wallpaper_home";
335     int32_t wallpaperFd = open(wallpaperPath.c_str(), O_RDONLY, S_IREAD);
336     FILE *file = fopen(wallpaperPath.c_str(), "rb");
337     if (file == nullptr) {
338         close(wallpaperFd);
339         return;
340     }
341     int32_t fend = fseek(file, 0, SEEK_END);
342     size = ftell(file);
343     int32_t fset = fseek(file, 0, SEEK_SET);
344     if (size <= 0 || fend != 0 || fset != 0) {
345         fclose(file);
346         close(wallpaperFd);
347         return;
348     }
349     if (fclose(file) < 0) {
350         close(wallpaperFd);
351         return;
352     }
353     WallpaperMgrService::WallpaperManager::GetInstance().CreatePixelMapByFd(wallpaperFd, size, pixelMap);
354     close(wallpaperFd);
355 
356     auto wallpaperProxy = WallpaperMgrService::WallpaperManager::GetInstance().GetService();
357     JScallback callback = nullptr;
358     WallpaperMgrService::WallpaperManager::GetInstance().RegisterWallpaperCallback(callback);
359     bool registerWallpaperCallback;
360     sptr<IWallpaperCallback> wallpaperCallback;
361     wallpaperProxy->RegisterWallpaperCallback(wallpaperCallback, registerWallpaperCallback);
362 }
363 
364 } // namespace OHOS
365 
366 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)367 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
368 {
369     FuzzedDataProvider provider(data, size);
370     /* Run your code on data */
371     OHOS::GetColorsFuzzTest(provider);
372     OHOS::GetWallpaperIdFuzzTest(provider);
373     OHOS::ResetWallpaperFuzzTest(provider);
374     OHOS::SetWallpaperByUriFuzzTest(provider);
375     OHOS::SetWallpaperByMapFuzzTest(provider);
376     OHOS::GetFileFuzzTest(provider);
377     OHOS::WallpaperManagerFuzzTest(provider);
378     OHOS::GetPixelMapFuzzTest(provider);
379     OHOS::SendEventFuzzTest(provider);
380     OHOS::SetVideoFuzzTest(provider);
381     OHOS::SetCustomWallpaperFuzzTest(provider);
382     OHOS::SetAllWallpapersFuzzTest(provider);
383     OHOS::GetCorrespondWallpaperFuzzTest(provider);
384     OHOS::IsDefaultWallpaperResourceFuzzTest(provider);
385     OHOS::WallpaperManagerProxyFuzzTest(provider);
386     OHOS::WallpaperManagerCallbackFuzzTest(provider);
387     return 0;
388 }