1 /*
2 * Copyright (c) 2023 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 #include "medialibrary_thumbnail_fuzzer.h"
16
17 #include <cstdint>
18 #include <string>
19 #include <pixel_map.h>
20
21 #include "ability_context_impl.h"
22 #include "datashare_helper.h"
23 #include "media_log.h"
24 #include "medialibrary_data_manager.h"
25 #include "medialibrary_unistore_manager.h"
26 #include "rdb_predicates.h"
27 #include "thumbnail_generate_helper.h"
28 #include "thumbnail_service.h"
29 #include "thumbnail_uri_utils.h"
30 #include "thumbnail_source_loading.h"
31
32 namespace OHOS {
33 using namespace std;
34 using namespace DataShare;
35
FuzzString(const uint8_t * data,size_t size)36 static inline string FuzzString(const uint8_t *data, size_t size)
37 {
38 return {reinterpret_cast<const char*>(data), size};
39 }
40
FuzzInt32(const uint8_t * data)41 static inline int32_t FuzzInt32(const uint8_t *data)
42 {
43 return static_cast<int32_t>(*data);
44 }
45
Init()46 static int Init()
47 {
48 auto stageContext = std::make_shared<AbilityRuntime::ContextImpl>();
49 auto abilityContextImpl = std::make_shared<OHOS::AbilityRuntime::AbilityContextImpl>();
50 abilityContextImpl->SetStageContext(stageContext);
51 int32_t sceneCode = 0;
52 return Media::MediaLibraryDataManager::GetInstance()->InitMediaLibraryMgr(abilityContextImpl, abilityContextImpl,
53 sceneCode);
54 }
55
ThumhnailTest(const uint8_t * data,size_t size)56 static void ThumhnailTest(const uint8_t* data, size_t size)
57 {
58 if (Init() != 0) {
59 MEDIA_ERR_LOG("Init medialibrary fail");
60 return;
61 }
62 Media::ThumbnailService::GetInstance()->GetThumbnailFd(FuzzString(data, size),
63 FuzzInt32(data));
64 string thumUri = "file://media/Photo/1?operation=thumbnail&width=-1&height=-1";
65 Media::ThumbnailService::GetInstance()->GetThumbnailFd(thumUri, FuzzInt32(data));
66 Media::ThumbnailService::GetInstance()->LcdAging();
67 Media::ThumbnailService::GetInstance()->CreateThumbnailFileScaned(FuzzString(data, size),
68 FuzzString(data, size), FuzzInt32(data));
69 NativeRdb::RdbPredicates rdbPredicate("Photos");
70 Media::ThumbnailService::GetInstance()->CreateAstcBatchOnDemand(rdbPredicate, FuzzInt32(data));
71 Media::ThumbnailService::GetInstance()->CancelAstcBatchTask(FuzzInt32(data));
72 Media::ThumbnailService::GetInstance()->GenerateThumbnailBackground();
73 Media::ThumbnailService::GetInstance()->UpgradeThumbnailBackground(false);
74 Media::ThumbnailService::GetInstance()->RestoreThumbnailDualFrame();
75 Media::ThumbnailService::GetInstance()->CheckCloudThumbnailDownloadFinish();
76 Media::ThumbnailService::GetInstance()->InterruptBgworker();
77 }
78
ThumbnailHelperTest(const uint8_t * data,size_t size)79 static void ThumbnailHelperTest(const uint8_t* data, size_t size)
80 {
81 auto rdbStore = Media::MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
82 if (rdbStore == nullptr) {
83 return;
84 }
85 Media::ThumbRdbOpt opts = {
86 .store = rdbStore,
87 .table = "Photos",
88 };
89 Media::ThumbnailGenerateHelper::GetThumbnailPixelMap(opts,
90 static_cast<Media::ThumbnailType>(FuzzInt32(data)));
91 Media::ThumbnailGenerateHelper::UpgradeThumbnailBackground(opts, false);
92 }
93
ThumbnailSourceTest(const uint8_t * data,size_t size)94 static void ThumbnailSourceTest(const uint8_t* data, size_t size)
95 {
96 Media::GetLocalThumbnailPath(FuzzString(data, size), FuzzString(data, size));
97 Media::Size mediaSize = {FuzzInt32(data), FuzzInt32(data)};
98 Media::ThumbnailData thumbData;
99 Media::ConvertDecodeSize(thumbData, mediaSize, mediaSize);
100 Media::DecodeOptions option;
101 option.fitDensity = FuzzInt32(data);
102 Media::GenDecodeOpts(mediaSize, mediaSize, option);
103 uint32_t err = 0;
104 Media::LoadImageSource(FuzzString(data, size), err);
105 Media::NeedAutoResize(mediaSize);
106 }
107
ParseFileUriTest(const uint8_t * data,size_t size)108 static void ParseFileUriTest(const uint8_t* data, size_t size)
109 {
110 string outFileId;
111 string outNetworkId;
112 string outTableName;
113 string uri = "file://media/Photo/2";
114 Media::ThumbnailUriUtils::ParseFileUri(uri, outFileId, outNetworkId, outTableName);
115 Media::ThumbnailUriUtils::GetDateTakenFromUri(FuzzString(data, size));
116 Media::ThumbnailUriUtils::GetFileUriFromUri(FuzzString(data, size));
117 }
118 } // namespace OHOS
119
120 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)121 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
122 {
123 /* Run your code on data */
124 OHOS::ThumhnailTest(data, size);
125 OHOS::ThumbnailHelperTest(data, size);
126 OHOS::ThumbnailSourceTest(data, size);
127 OHOS::ParseFileUriTest(data, size);
128 return 0;
129 }