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_common_fuzzer.h"
16 
17 #include <cstdint>
18 #include <string>
19 
20 #include "dfx_database_utils.h"
21 #include "exif_utils.h"
22 #include "media_log.h"
23 #include "media_photo_asset_proxy.h"
24 #include "media_scanner_manager.h"
25 #include "medialibrary_common_utils.h"
26 #include "media_file_uri.h"
27 #include "permission_utils.h"
28 
29 namespace OHOS {
30 using namespace std;
31 
FuzzString(const uint8_t * data,size_t size)32 static inline string FuzzString(const uint8_t *data, size_t size)
33 {
34     return {reinterpret_cast<const char*>(data), size};
35 }
36 
FuzzInt32(const uint8_t * data)37 static inline int32_t FuzzInt32(const uint8_t *data)
38 {
39     return static_cast<int32_t>(*data);
40 }
41 
FuzzDouble(const uint8_t * data,size_t size)42 static inline double FuzzDouble(const uint8_t *data, size_t size)
43 {
44     return static_cast<double>(*data);
45 }
46 
FuzzVectorString(const uint8_t * data,size_t size)47 static inline vector<string> FuzzVectorString(const uint8_t *data, size_t size)
48 {
49     return {FuzzString(data, size)};
50 }
51 
ScanTest(const uint8_t * data,size_t size)52 static void ScanTest(const uint8_t *data, size_t size)
53 {
54     auto scannerManager = Media::MediaScannerManager::GetInstance();
55     if (scannerManager != nullptr) {
56         scannerManager->ScanDir(FuzzString(data, size), nullptr);
57     }
58 }
59 
CommonUtilsTest(const uint8_t * data,size_t size)60 static void CommonUtilsTest(const uint8_t *data, size_t size)
61 {
62     Media::MediaLibraryCommonUtils::CheckWhereClause(FuzzString(data, size));
63     string key;
64     Media::MediaLibraryCommonUtils::GenKeySHA256(FuzzString(data, size), key);
65     string selection;
66     Media::MediaLibraryCommonUtils::AppendSelections(selection);
67 }
68 
DfxTest(const uint8_t * data,size_t size)69 static void DfxTest(const uint8_t *data, size_t size)
70 {
71     Media::DfxDatabaseUtils::QueryFromPhotos(FuzzInt32(data), FuzzInt32(data));
72     Media::DfxDatabaseUtils::QueryAlbumInfoBySubtype(FuzzInt32(data));
73     Media::DfxDatabaseUtils::QueryDirtyCloudPhoto();
74     Media::DfxDatabaseUtils::QueryAnalysisVersion(FuzzString(data, size), FuzzString(data, size));
75     int32_t downloadedThumb;
76     int32_t generatedThumb;
77     Media::DfxDatabaseUtils::QueryDownloadedAndGeneratedThumb(downloadedThumb, generatedThumb);
78     int32_t totalDownload;
79     Media::DfxDatabaseUtils::QueryTotalCloudThumb(totalDownload);
80     Media::DfxDatabaseUtils::QueryDbVersion();
81     Media::PhotoRecordInfo info = {
82         .imageCount = FuzzInt32(data),
83         .videoCount = FuzzInt32(data)
84     };
85     Media::DfxDatabaseUtils::QueryPhotoRecordInfo(info);
86 }
87 
PermissionUtilsTest(const uint8_t * data,size_t size)88 static void PermissionUtilsTest(const uint8_t *data, size_t size)
89 {
90     Media::PermissionUtils::CheckCallerPermission(FuzzString(data, size));
91     std::vector<std::string> perms;
92     Media::PermissionUtils::CheckCallerPermission(perms);
93     Media::PermissionUtils::CheckPhotoCallerPermission(perms);
94     Media::PermissionUtils::CheckPhotoCallerPermission(FuzzString(data, size));
95     Media::PermissionUtils::CheckHasPermission(perms);
96     perms.push_back(FuzzString(data, size));
97     Media::PermissionUtils::CheckHasPermission(perms);
98     string packageName;
99     Media::PermissionUtils::GetPackageName(FuzzInt32(data), packageName);
100     Media::PermissionUtils::CheckIsSystemAppByUid();
101     Media::PermissionUtils::GetPackageNameByBundleName(FuzzString(data, size));
102     Media::PermissionUtils::GetAppIdByBundleName(packageName);
103     Media::PermissionUtils::IsSystemApp();
104     Media::PermissionUtils::IsNativeSAApp();
105     Media::PermissionUtils::IsRootShell();
106     Media::PermissionUtils::IsHdcShell();
107     Media::PermissionUtils::GetTokenId();
108     Media::PermissionUtils::ClearBundleInfoInCache();
109     Media::PermissionUtils::CollectPermissionInfo(FuzzString(data, size), FuzzInt32(data),
110         static_cast<Security::AccessToken::PermissionUsedType>(FuzzInt32(data)));
111 }
112 
FileUriTest(const uint8_t * data,size_t size)113 static void FileUriTest(const uint8_t *data, size_t size)
114 {
115     string uriStr = FuzzString(data, size);
116     Media::MediaFileUri fileUri(uriStr);
117     fileUri.GetFilePath();
118     fileUri.GetFileId();
119     fileUri.GetTableName();
120     Media::MediaFileUri::GetPhotoId(FuzzString(data, size));
121     Media::MediaFileUri::RemoveAllFragment(uriStr);
122     Media::MediaFileUri::GetMediaTypeUri(static_cast<Media::MediaType>(FuzzInt32(data)), FuzzInt32(data));
123     vector<string> timeIdBatch;
124     int start = FuzzInt32(data);
125     int count = FuzzInt32(data);
126     Media::MediaFileUri::GetTimeIdFromUri(FuzzVectorString(data, size), timeIdBatch);
127     Media::MediaFileUri::GetTimeIdFromUri(FuzzVectorString(data, size), timeIdBatch, start, count);
128     Media::MediaFileUri::CreateAssetBucket(FuzzInt32(data), count);
129     Media::MediaFileUri::GetPathFromUri(FuzzString(data, size), FuzzInt32(data));
130 }
131 
ExifTest(const uint8_t * data,size_t size)132 static void ExifTest(const uint8_t *data, size_t size)
133 {
134     Media::ExifUtils::WriteGpsExifInfo(FuzzString(data, size), FuzzDouble(data, size), FuzzDouble(data, size));
135 }
136 
PhotoProxyTest(const uint8_t * data,size_t size)137 static void PhotoProxyTest(const uint8_t *data, size_t size)
138 {
139     Media::PhotoAssetProxy proxy(nullptr, static_cast<Media::CameraShotType>(FuzzInt32(data)),
140         FuzzInt32(data), FuzzInt32(data));
141     proxy.GetFileAsset();
142     proxy.GetPhotoAssetUri();
143     proxy.GetVideoFd();
144 }
145 } // namespace OHOS
146 
147 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)148 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
149 {
150     /* Run your code on data */
151     OHOS::ScanTest(data, size);
152     OHOS::CommonUtilsTest(data, size);
153     OHOS::PermissionUtilsTest(data, size);
154     OHOS::FileUriTest(data, size);
155     OHOS::DfxTest(data, size);
156     OHOS::ExifTest(data, size);
157     OHOS::PhotoProxyTest(data, size);
158     return 0;
159 }
160