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