• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }