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 "filetransfermanager_fuzzer.h"
16
17 #include <cstddef>
18 #include <cstdint>
19 #include <memory>
20 #include <string>
21
22 #include "cloud_fuzzer_helper.h"
23 #include "file_transfer_manager.h"
24 #include "task_state_manager.h"
25
26 namespace OHOS {
27 constexpr size_t U16_AT_SIZE = 2;
28 constexpr size_t U32_AT_SIZE = 4;
29 constexpr size_t U64_AT_SIZE = 8;
30
31 using namespace std;
32 using namespace OHOS::FileManagement::CloudSync;
33
DownloadFileFromRemoteDeviceFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,FuzzData & fuzzData,size_t size)34 bool DownloadFileFromRemoteDeviceFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
35 FuzzData &fuzzData,
36 size_t size)
37 {
38 fuzzData.ResetData(size);
39 int32_t userId = fuzzData.GetData<int32_t>();
40 uint64_t taskId = fuzzData.GetData<uint64_t>();
41 std::string networkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
42 int len = fuzzData.GetRemainSize();
43 std::string uri = fuzzData.GetStringFromData(len);
44 fileTransferMgrPtr->DownloadFileFromRemoteDevice(networkId, userId, taskId, uri);
45 return true;
46 }
47
HandleDownloadFileRequestFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,FuzzData & fuzzData,size_t size)48 bool HandleDownloadFileRequestFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
49 FuzzData &fuzzData,
50 size_t size)
51 {
52 fuzzData.ResetData(size);
53 int32_t userId = fuzzData.GetData<int32_t>();
54 uint64_t taskId = fuzzData.GetData<uint64_t>();
55 int receiverSessionId = fuzzData.GetData<int>();
56 std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
57 int len = fuzzData.GetRemainSize();
58 std::string uri = fuzzData.GetStringFromData(len);
59 MessageInputInfo msgInputInfo;
60 msgInputInfo.userId = userId;
61 msgInputInfo.taskId = taskId;
62 msgInputInfo.uri = uri;
63 MessageHandler msgHandle(msgInputInfo);
64 fileTransferMgrPtr->HandleDownloadFileRequest(msgHandle, senderNetworkId, receiverSessionId);
65 return true;
66 }
67
HandleDownloadFileResponseFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,FuzzData & fuzzData,size_t size)68 bool HandleDownloadFileResponseFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
69 FuzzData &fuzzData,
70 size_t size)
71 {
72 fuzzData.ResetData(size);
73 int32_t errorCode = fuzzData.GetData<int32_t>();
74 uint64_t taskId = fuzzData.GetData<uint64_t>();
75 int len = fuzzData.GetRemainSize();
76 std::string uri = fuzzData.GetStringFromData(len);
77 MessageInputInfo msgInputInfo;
78 msgInputInfo.errorCode = errorCode;
79 msgInputInfo.taskId = taskId;
80 msgInputInfo.uri = uri;
81 MessageHandler msgHandle(msgInputInfo);
82 fileTransferMgrPtr->HandleDownloadFileResponse(msgHandle);
83 return true;
84 }
85
OnMessageHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,FuzzData & fuzzData,size_t size)86 bool OnMessageHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr, FuzzData &fuzzData, size_t size)
87 {
88 fuzzData.ResetData(size);
89 std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
90 int receiverSessionId = fuzzData.GetData<int>();
91 int32_t errorCode = fuzzData.GetData<int32_t>();
92 int32_t userId = fuzzData.GetData<int32_t>();
93 uint64_t taskId = fuzzData.GetData<uint64_t>();
94 uint16_t msgType =
95 fuzzData.GetData<uint16_t>() % (MsgType::MSG_FINISH_FILE_RECV + static_cast<int16_t>(U16_AT_SIZE));
96 int len = static_cast<int>(fuzzData.GetRemainSize());
97 std::string uri = fuzzData.GetStringFromData(len);
98 MessageInputInfo msgInputInfo;
99 msgInputInfo.errorCode = errorCode;
100 msgInputInfo.taskId = taskId;
101 msgInputInfo.uri = uri;
102 msgInputInfo.userId = userId;
103 msgInputInfo.msgType = msgType;
104 MessageHandler msgHandle(msgInputInfo);
105 auto dataSubPtr = std::make_unique<uint8_t[]>(size);
106 msgHandle.PackData(dataSubPtr.get(), static_cast<uint32_t>(size));
107 fileTransferMgrPtr->OnMessageHandle(senderNetworkId, receiverSessionId, dataSubPtr.get(), msgHandle.GetDataSize());
108 return true;
109 }
110
OnFileRecvHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,FuzzData & fuzzData,size_t size)111 bool OnFileRecvHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr, FuzzData &fuzzData, size_t size)
112 {
113 fuzzData.ResetData(size);
114 std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
115 int result = fuzzData.GetData<int>();
116 int len = static_cast<int>(fuzzData.GetRemainSize());
117 std::string filePath = fuzzData.GetStringFromData(len);
118 fileTransferMgrPtr->OnFileRecvHandle(senderNetworkId, filePath.c_str(), result);
119 fileTransferMgrPtr->HandleRecvFileFinished();
120 fileTransferMgrPtr->OnSessionClosed();
121 return true;
122 }
123 } // namespace OHOS
124
125 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)126 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
127 {
128 /* Run your code on data */
129 if (data == nullptr || size <= (OHOS::U16_AT_SIZE + OHOS::U64_AT_SIZE + (OHOS::U32_AT_SIZE << 1) +
130 (OHOS::FileManagement::CloudSync::NETWORK_ID_SIZE_MAX << 1))) {
131 return 0;
132 }
133
134 OHOS::FuzzData fuzzData(data, size);
135 auto sessionMgrPtr = std::make_shared<OHOS::FileManagement::CloudSync::SessionManager>();
136 std::shared_ptr<OHOS::FileManagement::CloudSync::FileTransferManager> fileTransferMgrPtr =
137 std::make_shared<OHOS::FileManagement::CloudSync::FileTransferManager>(sessionMgrPtr);
138 fileTransferMgrPtr->Init();
139
140 OHOS::DownloadFileFromRemoteDeviceFuzzTest(fileTransferMgrPtr, fuzzData, size);
141 OHOS::HandleDownloadFileRequestFuzzTest(fileTransferMgrPtr, fuzzData, size);
142 OHOS::HandleDownloadFileResponseFuzzTest(fileTransferMgrPtr, fuzzData, size);
143 OHOS::OnMessageHandleFuzzTest(fileTransferMgrPtr, fuzzData, size);
144 OHOS::OnFileRecvHandleFuzzTest(fileTransferMgrPtr, fuzzData, size);
145
146 if (OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_ != nullptr) {
147 OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().queue_.wait(
148 OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_);
149 }
150 return 0;
151 }
152