1 /*
2 * Copyright (c) 2025 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
16 #include "medialibrarycloudmediasyncdataconvert_fuzzer.h"
17
18 #include <cstdint>
19 #include <string>
20 #include <fuzzer/FuzzedDataProvider.h>
21 #define private public
22 #include "cloud_album_data_convert.h"
23 #include "cloud_file_data_convert.h"
24 #include "cloud_data_convert_to_vo.h"
25 #undef private
26 #include "media_log.h"
27
28 namespace OHOS {
29 using namespace std;
30 using namespace OHOS::Media;
31 using namespace OHOS::Media::CloudSync;
32 const int32_t NUM_BYTES = 1;
33 FuzzedDataProvider* provider;
34
FuzzAlbumType()35 static inline AlbumType FuzzAlbumType()
36 {
37 int32_t value = provider->ConsumeIntegral<int32_t>();
38 if (value >= static_cast<int32_t>(AlbumType::NORMAL) &&
39 value <= static_cast<int32_t>(AlbumType::SOURCE)) {
40 return static_cast<AlbumType>(value);
41 }
42 return AlbumType::SOURCE;
43 }
44
FuzzCloudMdkRecordPhotoAlbumVo()45 static CloudMdkRecordPhotoAlbumVo FuzzCloudMdkRecordPhotoAlbumVo()
46 {
47 CloudMdkRecordPhotoAlbumVo albumData;
48 albumData.albumType = FuzzAlbumType();
49 albumData.cloudId = provider->ConsumeBytesAsString(NUM_BYTES);
50 albumData.albumId = provider->ConsumeIntegral<int32_t>();
51 albumData.albumSubtype = provider->ConsumeIntegral<int32_t>();
52 albumData.isInWhiteList = provider->ConsumeBool();
53 albumData.lpath = provider->ConsumeBytesAsString(NUM_BYTES);
54 albumData.dualAlbumName = provider->ConsumeBytesAsString(NUM_BYTES);
55 albumData.albumNameEn = provider->ConsumeBytesAsString(NUM_BYTES);
56 albumData.dateModified = provider->ConsumeIntegral<int64_t>();
57 albumData.dateAdded = 0;
58 albumData.bundleName = provider->ConsumeBytesAsString(NUM_BYTES);
59 albumData.localLanguage = provider->ConsumeBytesAsString(NUM_BYTES);
60 return albumData;
61 }
62
CloudAlbumDataConvertFuzzer()63 static void CloudAlbumDataConvertFuzzer()
64 {
65 CloudAlbumDataConvert cloudAlbumDataConvert;
66 std::map<string, MDKRecordField> map;
67 CloudMdkRecordPhotoAlbumVo albumData = FuzzCloudMdkRecordPhotoAlbumVo();
68 shared_ptr<MDKRecord> record = make_shared<MDKRecord>();
69 std::map<string, MDKRecordField> dataMap;
70 CloudMdkRecordPhotoAlbumVo upLoadRecord;
71 cloudAlbumDataConvert.HandleAlbumName(map, albumData);
72 cloudAlbumDataConvert.HandleGeneral(map, albumData);
73 cloudAlbumDataConvert.HandleProperties(record, dataMap, albumData);
74 cloudAlbumDataConvert.HandleAlbumLogicType(map, albumData);
75 cloudAlbumDataConvert.HandleType(map, albumData);
76 cloudAlbumDataConvert.HandleAlbumId(map, albumData);
77 cloudAlbumDataConvert.HandleRecordId(record, albumData);
78 cloudAlbumDataConvert.HandlePath(map, albumData);
79 cloudAlbumDataConvert.FillRecordId(record, albumData);
80 cloudAlbumDataConvert.HandleEmptyShow(record, dataMap, albumData);
81 cloudAlbumDataConvert.ConvertToDoubleScreenshot(record, dataMap);
82 cloudAlbumDataConvert.ConvertToMdkRecord(upLoadRecord);
83 }
84
CloudFileDataConvertFuzzer()85 static void CloudFileDataConvertFuzzer()
86 {
87 CloudFileDataConvert cloudFileDataConvert;
88 CloudMdkRecordPhotoAlbumVo albumData;
89 string path = provider->ConsumeBytesAsString(NUM_BYTES);
90 string key = provider->ConsumeBytesAsString(NUM_BYTES);
91 string thumbSuffix = provider->ConsumeBytesAsString(NUM_BYTES);
92 int64_t fileSize = provider->ConsumeIntegral<int64_t>();
93 cloudFileDataConvert.GetThumbPath(path, key);
94 cloudFileDataConvert.GetFileSize(path, thumbSuffix, fileSize);
95
96 std::map<std::string, MDKRecordField> map;
97 std::map<std::string, MDKRecordField> dataMap;
98 std::map<std::string, MDKRecordField> recordData;
99 bool isMovingPhoto = true;
100 CloudMdkRecordPhotosVo upLoadRecord;
101 cloudFileDataConvert.HandleThumbSize(map, upLoadRecord);
102 cloudFileDataConvert.HandleLcdSize(map, upLoadRecord);
103 cloudFileDataConvert.HandleFormattedDate(map, upLoadRecord);
104 cloudFileDataConvert.HandleUniqueFileds(dataMap, upLoadRecord);
105 cloudFileDataConvert.HandleFileType(dataMap, upLoadRecord);
106 cloudFileDataConvert.HandlePosition(map, upLoadRecord);
107 cloudFileDataConvert.HandleRotate(map, upLoadRecord);
108 cloudFileDataConvert.HandleProperties(dataMap, upLoadRecord);
109
110 int32_t orientation = provider->ConsumeIntegral<int32_t>();
111 cloudFileDataConvert.GetLowerPath(path);
112 cloudFileDataConvert.HandleEditData(dataMap, path, isMovingPhoto);
113 cloudFileDataConvert.HandleContent(dataMap, upLoadRecord);
114 cloudFileDataConvert.HandleThumbnail(recordData, path, orientation);
115 cloudFileDataConvert.GetParentPath(path);
116 cloudFileDataConvert.HandleLcd(recordData, path, orientation);
117 cloudFileDataConvert.HandleAttachments(recordData, upLoadRecord);
118
119 MDKRecord record;
120 vector<MDKRecord> records;
121 cloudFileDataConvert.SetSourceAlbum(record, upLoadRecord);
122 cloudFileDataConvert.InsertAlbumIdChanges(record, records, upLoadRecord);
123
124 cloudFileDataConvert.HandleCompatibleFileds(dataMap, upLoadRecord);
125 cloudFileDataConvert.ConvertToMdkRecord(upLoadRecord, record);
126
127 string cloudId = provider->ConsumeBytesAsString(NUM_BYTES);
128 MDKRecordOperResult result;
129 OnCopyRecord onCopyRecord;
130 OnModifyRecord onModifyRecord;
131 OnFileDirtyRecord onFileDirtyRecord;
132 OnCreateRecord onCreateRecord;
133 MDKRecord mdkRecord;
134 OnFetchPhotosVo OnFetchPhotoVo;
135 cloudFileDataConvert.BuildCopyRecord(cloudId, result, onCopyRecord);
136 cloudFileDataConvert.BuildModifyRecord(cloudId, result, onModifyRecord);
137 cloudFileDataConvert.ConvertFdirtyRecord(cloudId, result, onFileDirtyRecord);
138 cloudFileDataConvert.ConvertToOnCreateRecord(cloudId, result, onCreateRecord);
139 cloudFileDataConvert.ConverMDKRecordToOnFetchPhotosVo(mdkRecord, OnFetchPhotoVo);
140 }
141
CloudDataConvertToVoFuzzer()142 static void CloudDataConvertToVoFuzzer()
143 {
144 CloudDataConvertToVo cloudDataConvertToVo;
145 PhotosVo photosVo;
146 photosVo.fileId = provider->ConsumeIntegral<int32_t>();
147 photosVo.cloudId = provider->ConsumeBytesAsString(NUM_BYTES);
148 photosVo.size = provider->ConsumeIntegral<int64_t>();
149 photosVo.path = provider->ConsumeBytesAsString(NUM_BYTES);
150 photosVo.fileName = provider->ConsumeBytesAsString(NUM_BYTES);
151 photosVo.type = provider->ConsumeIntegral<int32_t>();
152 photosVo.modifiedTime = provider->ConsumeIntegral<int64_t>();
153 photosVo.originalCloudId = provider->ConsumeBytesAsString(NUM_BYTES);
154 std::map<std::string, CloudFileDataVo> attachment;
155 CloudFileDataVo file;
156 file.fileName = provider->ConsumeBytesAsString(NUM_BYTES);
157 file.filePath = provider->ConsumeBytesAsString(NUM_BYTES);
158 file.size = provider->ConsumeIntegral<int64_t>();
159 attachment[file.fileName] = file;
160 photosVo.attachment = attachment;
161 cloudDataConvertToVo.ConvertPhotosVoToCloudMetaData(photosVo);
162 }
163 } // namespace OHOS
164
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)165 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
166 {
167 FuzzedDataProvider fdp(data, size);
168 if (data == nullptr) {
169 return 0;
170 }
171 OHOS::provider = &fdp;
172 OHOS::CloudAlbumDataConvertFuzzer();
173 OHOS::CloudFileDataConvertFuzzer();
174 OHOS::CloudDataConvertToVoFuzzer();
175 return 0;
176 }