• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }