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 #include "medialibrary_mtp_mediasyncobserver_fuzzer.h"
16
17 #include <cstdint>
18 #include <string>
19 #include <vector>
20 #include <fuzzer/FuzzedDataProvider.h>
21
22 #include "system_ability_definition.h"
23 #include "iservice_registry.h"
24 #include "userfilemgr_uri.h"
25 #include "payload_data.h"
26 #include "close_session_data.h"
27 #include "media_log.h"
28 #include "media_library_custom_restore.h"
29 #include "userfile_manager_types.h"
30 #include "datashare_observer.h"
31 #include "datashare_helper.h"
32
33 #define private public
34 #include "ptp_media_sync_observer.h"
35 #undef private
36
37 namespace OHOS {
38 using namespace std;
39 using namespace Media;
40 static const int32_t NUM_BYTES = 1;
41 static const int32_t MAX_CHANGE_TYPE = 4;
42 constexpr int FUZZ_STORAGE_MANAGER_MANAGER_ID = 5003;
43 FuzzedDataProvider *provider = nullptr;
44
FuzzChangeType()45 static DataShareObserver::ChangeType FuzzChangeType()
46 {
47 int32_t value = provider->ConsumeIntegralInRange<int32_t>(0, MAX_CHANGE_TYPE);
48 return static_cast<DataShareObserver::ChangeType>(value);
49 }
50
CreateDataShareHelper()51 static std::shared_ptr<DataShare::DataShareHelper> CreateDataShareHelper()
52 {
53 shared_ptr<MtpOperationContext> context = make_shared<MtpOperationContext>();
54 if (context == nullptr) {
55 MEDIA_ERR_LOG("context is nullptr");
56 return nullptr;
57 }
58 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
59 if (saManager == nullptr) {
60 MEDIA_ERR_LOG("Get system ability mgr failed.");
61 return nullptr;
62 }
63 auto remoteObj = saManager->GetSystemAbility(FUZZ_STORAGE_MANAGER_MANAGER_ID);
64 if (remoteObj == nullptr) {
65 MEDIA_ERR_LOG("GetSystemAbility Service Failed.");
66 return nullptr;
67 }
68 sptr<IRemoteObject> token = remoteObj;
69 return DataShare::DataShareHelper::Creator(token, MEDIALIBRARY_DATA_URI);
70 }
71
InitMediaSyncObserver()72 static shared_ptr<MediaSyncObserver> InitMediaSyncObserver()
73 {
74 shared_ptr<MtpOperationContext> context = make_shared<MtpOperationContext>();
75 if (context == nullptr) {
76 MEDIA_ERR_LOG("context is nullptr");
77 return nullptr;
78 }
79 shared_ptr<MediaSyncObserver> mediaSyncObserver = make_shared<MediaSyncObserver>();
80 mediaSyncObserver->context_ = context;
81 mediaSyncObserver->context_->mtpDriver = make_shared<MtpDriver>();
82 mediaSyncObserver->dataShareHelper_ = CreateDataShareHelper();
83 return mediaSyncObserver;
84 }
85
PtpMediaSyncObserverTest()86 static void PtpMediaSyncObserverTest()
87 {
88 shared_ptr<MediaSyncObserver> mediaSyncObserver = InitMediaSyncObserver();
89 ChangeInfo changeInfo;
90 string dataTest = provider->ConsumeBytesAsString(NUM_BYTES);
91 changeInfo.data_ = dataTest.c_str();
92 changeInfo.size_ = provider->ConsumeIntegral<uint32_t>();
93 uint32_t objectHandle = provider->ConsumeIntegral<uint32_t>();
94 uint16_t eventCode = provider->ConsumeIntegral<uint16_t>();
95 int32_t handle = provider->ConsumeIntegral<int32_t>();
96 DataShareObserver::ChangeType changeType = FuzzChangeType();
97 string suffixString = "1";
98 std::vector<std::string> handles;
99 handles.push_back("handle");
100 std::vector<int32_t> albumIds;
101 albumIds.push_back(1);
102 std::set<int32_t> albumIds_;
103 mediaSyncObserver->OnChange(changeInfo);
104 mediaSyncObserver->OnChangeEx(changeInfo);
105 mediaSyncObserver->StartNotifyThread();
106 mediaSyncObserver->StartDelayInfoThread();
107
108 mediaSyncObserver->SendEventPackets(objectHandle, eventCode);
109 mediaSyncObserver->SendEventPacketAlbum(objectHandle, eventCode);
110 mediaSyncObserver->SendPhotoEvent(changeType, suffixString);
111 mediaSyncObserver->GetHandlesFromPhotosInfoBurstKeys(handles);
112 mediaSyncObserver->SendEventToPTP(changeType, albumIds);
113 mediaSyncObserver->GetAllDeleteHandles();
114 mediaSyncObserver->GetAlbumIdList(albumIds_);
115 mediaSyncObserver->GetOwnerAlbumIdList(albumIds_);
116 mediaSyncObserver->GetAddEditPhotoHandles(handle);
117 mediaSyncObserver->GetAddEditAlbumHandle(handle);
118 mediaSyncObserver->AddPhotoHandle(handle);
119 mediaSyncObserver->SendPhotoRemoveEvent(suffixString);
120 mediaSyncObserver->HandleMovePhotoEvent(changeInfo);
121
122 mediaSyncObserver->StopDelayInfoThread();
123 mediaSyncObserver->StopNotifyThread();
124 }
125 } // namespace OHOS
126
LLVMFuzzerInitialize(int * argc,char *** argv)127 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
128 {
129 OHOS::InitMediaSyncObserver();
130 return 0;
131 }
132
133 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)134 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
135 {
136 /* Run your code on data */
137 FuzzedDataProvider fdp(data, size);
138 OHOS::provider = &fdp;
139 if (data == nullptr) {
140 return 0;
141 }
142 OHOS::PtpMediaSyncObserverTest();
143 return 0;
144 }