1 /*
2 * Copyright (c) 2024 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 "cloudsyncassetmanager_fuzzer.h"
16
17 #include <cstddef>
18 #include <cstdint>
19 #include <vector>
20
21 #include "cloud_fuzzer_helper.h"
22 #include "cloud_sync_asset_manager_impl.h"
23
24 namespace OHOS {
25 constexpr size_t U32_AT_SIZE = 4;
26 constexpr size_t BOOL_AT_SIZE = 1;
27 constexpr size_t SPLITE_SIZE = 6;
28 constexpr size_t NETWORK_ID_SIZE = 65;
29
30 using namespace OHOS::FileManagement::CloudSync;
31 using namespace std;
32
UploadAssetFuzzTest(FuzzData & fuzzData,size_t size)33 void UploadAssetFuzzTest(FuzzData &fuzzData, size_t size)
34 {
35 fuzzData.ResetData(size);
36 int32_t userId = fuzzData.GetData<int32_t>();
37 std::string request = fuzzData.GetStringFromData(static_cast<int>(size - U32_AT_SIZE));
38 std::string result;
39 CloudSyncAssetManager::GetInstance().UploadAsset(userId, request, result);
40 }
41
DownloadFileFuzzTest(FuzzData & fuzzData,size_t size)42 void DownloadFileFuzzTest(FuzzData &fuzzData, size_t size)
43 {
44 fuzzData.ResetData(size);
45 int32_t userId = fuzzData.GetData<int32_t>();
46 int len = static_cast<int>((size - U32_AT_SIZE) / SPLITE_SIZE);
47 if (len <= 0) {
48 return;
49 }
50 AssetInfo assetInfo = {
51 .uri = fuzzData.GetStringFromData(len),
52 .recordType = fuzzData.GetStringFromData(len),
53 .recordId = fuzzData.GetStringFromData(len),
54 .fieldKey = fuzzData.GetStringFromData(len),
55 .assetName = fuzzData.GetStringFromData(len),
56 };
57 std::string bundleName = fuzzData.GetStringFromData(len);
58 CloudSyncAssetManager::GetInstance().DownloadFile(userId, bundleName, assetInfo);
59 }
60
DownloadFilesFuzzTest(FuzzData & fuzzData,size_t size)61 void DownloadFilesFuzzTest(FuzzData &fuzzData, size_t size)
62 {
63 fuzzData.ResetData(size);
64 int32_t userId = fuzzData.GetData<int32_t>();
65 int len = static_cast<int>((size - U32_AT_SIZE) / SPLITE_SIZE);
66 if (len <= 0) {
67 return;
68 }
69 AssetInfo assetInfo = {
70 .uri = fuzzData.GetStringFromData(len),
71 .recordType = fuzzData.GetStringFromData(len),
72 .recordId = fuzzData.GetStringFromData(len),
73 .fieldKey = fuzzData.GetStringFromData(len),
74 .assetName = fuzzData.GetStringFromData(len),
75 };
76 vector<AssetInfo> assetInfos;
77 assetInfos.emplace_back(assetInfo);
78 std::string bundleName = fuzzData.GetStringFromData(len);
79 vector<bool> assetResultMap;
80 CloudSyncAssetManager::GetInstance().DownloadFiles(userId, bundleName, assetInfos, assetResultMap);
81 }
82
DownloadFileCallbackFuzzTest(FuzzData & fuzzData,size_t size)83 void DownloadFileCallbackFuzzTest(FuzzData &fuzzData, size_t size)
84 {
85 fuzzData.ResetData(size);
86 int32_t userId = fuzzData.GetData<int32_t>();
87 std::string networkId = fuzzData.GetStringFromData(static_cast<int>(NETWORK_ID_SIZE));
88 auto remainSize = fuzzData.GetRemainSize();
89 int len = static_cast<int>(remainSize / SPLITE_SIZE);
90 if (len <= 0) {
91 return;
92 }
93 std::string bundleName = fuzzData.GetStringFromData(len);
94 AssetInfo assetInfo = {
95 .uri = fuzzData.GetStringFromData(len),
96 .recordType = fuzzData.GetStringFromData(len),
97 .recordId = fuzzData.GetStringFromData(len),
98 .fieldKey = fuzzData.GetStringFromData(len),
99 .assetName = fuzzData.GetStringFromData(len),
100 };
101 auto callback = [](const std::string &, int32_t) {};
102 CloudSyncAssetManager::GetInstance().DownloadFile(userId, bundleName, networkId, assetInfo, callback);
103 }
104
DeleteAssetFuzzTest(FuzzData & fuzzData,size_t size)105 void DeleteAssetFuzzTest(FuzzData &fuzzData, size_t size)
106 {
107 fuzzData.ResetData(size);
108 int32_t userId = fuzzData.GetData<int32_t>();
109 std::string uri = fuzzData.GetStringFromData(static_cast<int>(size - U32_AT_SIZE));
110 CloudSyncAssetManager::GetInstance().DeleteAsset(userId, uri);
111 }
112 } // namespace OHOS
113
114 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)115 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
116 {
117 /* Run your code on data */
118 if (data == nullptr ||
119 size <= (OHOS::U32_AT_SIZE + static_cast<size_t>(OHOS::NETWORK_ID_SIZE + OHOS::SPLITE_SIZE))) {
120 return 0;
121 }
122
123 OHOS::FuzzData fuzzData(data, size);
124 OHOS::UploadAssetFuzzTest(fuzzData, size);
125 OHOS::DownloadFileFuzzTest(fuzzData, size);
126 OHOS::DownloadFilesFuzzTest(fuzzData, size);
127 OHOS::DownloadFileCallbackFuzzTest(fuzzData, size);
128 OHOS::DeleteAssetFuzzTest(fuzzData, size);
129 return 0;
130 }
131