* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "filetransfermanager_fuzzer.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string>
#include "cloud_fuzzer_helper.h"
#include "file_transfer_manager.h"
#include "task_state_manager.h"
namespace OHOS {
constexpr size_t U16_AT_SIZE = 2;
constexpr size_t U32_AT_SIZE = 4;
constexpr size_t U64_AT_SIZE = 8;
using namespace std;
using namespace OHOS::FileManagement::CloudSync;
bool DownloadFileFromRemoteDeviceFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
FuzzData &fuzzData,
size_t size)
{
fuzzData.ResetData(size);
int32_t userId = fuzzData.GetData<int32_t>();
uint64_t taskId = fuzzData.GetData<uint64_t>();
std::string networkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
int len = fuzzData.GetRemainSize();
std::string uri = fuzzData.GetStringFromData(len);
fileTransferMgrPtr->DownloadFileFromRemoteDevice(networkId, userId, taskId, uri);
return true;
}
bool HandleDownloadFileRequestFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
FuzzData &fuzzData,
size_t size)
{
fuzzData.ResetData(size);
int32_t userId = fuzzData.GetData<int32_t>();
uint64_t taskId = fuzzData.GetData<uint64_t>();
int receiverSessionId = fuzzData.GetData<int>();
std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
int len = fuzzData.GetRemainSize();
std::string uri = fuzzData.GetStringFromData(len);
MessageInputInfo msgInputInfo;
msgInputInfo.userId = userId;
msgInputInfo.taskId = taskId;
msgInputInfo.uri = uri;
MessageHandler msgHandle(msgInputInfo);
fileTransferMgrPtr->HandleDownloadFileRequest(msgHandle, senderNetworkId, receiverSessionId);
return true;
}
bool HandleDownloadFileResponseFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr,
FuzzData &fuzzData,
size_t size)
{
fuzzData.ResetData(size);
int32_t errorCode = fuzzData.GetData<int32_t>();
uint64_t taskId = fuzzData.GetData<uint64_t>();
int len = fuzzData.GetRemainSize();
std::string uri = fuzzData.GetStringFromData(len);
MessageInputInfo msgInputInfo;
msgInputInfo.errorCode = errorCode;
msgInputInfo.taskId = taskId;
msgInputInfo.uri = uri;
MessageHandler msgHandle(msgInputInfo);
fileTransferMgrPtr->HandleDownloadFileResponse(msgHandle);
return true;
}
bool OnMessageHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr, FuzzData &fuzzData, size_t size)
{
fuzzData.ResetData(size);
std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
int receiverSessionId = fuzzData.GetData<int>();
int32_t errorCode = fuzzData.GetData<int32_t>();
int32_t userId = fuzzData.GetData<int32_t>();
uint64_t taskId = fuzzData.GetData<uint64_t>();
uint16_t msgType =
fuzzData.GetData<uint16_t>() % (MsgType::MSG_FINISH_FILE_RECV + static_cast<int16_t>(U16_AT_SIZE));
int len = static_cast<int>(fuzzData.GetRemainSize());
std::string uri = fuzzData.GetStringFromData(len);
MessageInputInfo msgInputInfo;
msgInputInfo.errorCode = errorCode;
msgInputInfo.taskId = taskId;
msgInputInfo.uri = uri;
msgInputInfo.userId = userId;
msgInputInfo.msgType = msgType;
MessageHandler msgHandle(msgInputInfo);
auto dataSubPtr = std::make_unique<uint8_t[]>(size);
msgHandle.PackData(dataSubPtr.get(), static_cast<uint32_t>(size));
fileTransferMgrPtr->OnMessageHandle(senderNetworkId, receiverSessionId, dataSubPtr.get(), msgHandle.GetDataSize());
return true;
}
bool OnFileRecvHandleFuzzTest(shared_ptr<FileTransferManager> fileTransferMgrPtr, FuzzData &fuzzData, size_t size)
{
fuzzData.ResetData(size);
std::string senderNetworkId = fuzzData.GetStringFromData(NETWORK_ID_SIZE_MAX);
int result = fuzzData.GetData<int>();
int len = static_cast<int>(fuzzData.GetRemainSize());
std::string filePath = fuzzData.GetStringFromData(len);
fileTransferMgrPtr->OnFileRecvHandle(senderNetworkId, filePath.c_str(), result);
fileTransferMgrPtr->HandleRecvFileFinished();
fileTransferMgrPtr->OnSessionClosed();
return true;
}
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
if (data == nullptr || size <= (OHOS::U16_AT_SIZE + OHOS::U64_AT_SIZE + (OHOS::U32_AT_SIZE << 1) +
(OHOS::FileManagement::CloudSync::NETWORK_ID_SIZE_MAX << 1))) {
return 0;
}
OHOS::FuzzData fuzzData(data, size);
auto sessionMgrPtr = std::make_shared<OHOS::FileManagement::CloudSync::SessionManager>();
std::shared_ptr<OHOS::FileManagement::CloudSync::FileTransferManager> fileTransferMgrPtr =
std::make_shared<OHOS::FileManagement::CloudSync::FileTransferManager>(sessionMgrPtr);
fileTransferMgrPtr->Init();
OHOS::DownloadFileFromRemoteDeviceFuzzTest(fileTransferMgrPtr, fuzzData, size);
OHOS::HandleDownloadFileRequestFuzzTest(fileTransferMgrPtr, fuzzData, size);
OHOS::HandleDownloadFileResponseFuzzTest(fileTransferMgrPtr, fuzzData, size);
OHOS::OnMessageHandleFuzzTest(fileTransferMgrPtr, fuzzData, size);
OHOS::OnFileRecvHandleFuzzTest(fileTransferMgrPtr, fuzzData, size);
if (OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_ != nullptr) {
OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().queue_.wait(
OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_);
}
return 0;
}