1f857971dSopenharmony_ci/* 2f857971dSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3f857971dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f857971dSopenharmony_ci * you may not use this file except in compliance with the License. 5f857971dSopenharmony_ci * You may obtain a copy of the License at 6f857971dSopenharmony_ci * 7f857971dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f857971dSopenharmony_ci * 9f857971dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f857971dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f857971dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f857971dSopenharmony_ci * See the License for the specific language governing permissions and 13f857971dSopenharmony_ci * limitations under the License. 14f857971dSopenharmony_ci */ 15f857971dSopenharmony_ci 16f857971dSopenharmony_ci#include "ipcsocket_fuzzer.h" 17f857971dSopenharmony_ci 18f857971dSopenharmony_ci#include "singleton.h" 19f857971dSopenharmony_ci 20f857971dSopenharmony_ci#include "devicestatus_define.h" 21f857971dSopenharmony_ci#include "i_tunnel_client.h" 22f857971dSopenharmony_ci#include "i_plugin.h" 23f857971dSopenharmony_ci#include "socket_client.h" 24f857971dSopenharmony_ci#include "socket_session_manager.h" 25f857971dSopenharmony_ci#include "socket_session.h" 26f857971dSopenharmony_ci#include "socket_connection.h" 27f857971dSopenharmony_ci#include "socket_params.h" 28f857971dSopenharmony_ci#include "stream_client.h" 29f857971dSopenharmony_ci#include "tunnel_client.h" 30f857971dSopenharmony_ci 31f857971dSopenharmony_ci#include "message_parcel.h" 32f857971dSopenharmony_ci 33f857971dSopenharmony_ci#undef LOG_TAG 34f857971dSopenharmony_ci#define LOG_TAG "IpcSocketFuzzTest" 35f857971dSopenharmony_cinamespace OHOS { 36f857971dSopenharmony_cinamespace Msdp { 37f857971dSopenharmony_cinamespace DeviceStatus { 38f857971dSopenharmony_ciconst std::u16string FORMMGR_INTERFACE_TOKEN { u"ohos.msdp.Idevicestatus" }; 39f857971dSopenharmony_ciinline constexpr int32_t MAX_EVENT_SIZE { 100 }; 40f857971dSopenharmony_ciconst uint8_t *g_baseFuzzData = nullptr; 41f857971dSopenharmony_cisize_t g_baseFuzzSize = 0; 42f857971dSopenharmony_cisize_t g_baseFuzzPos = 0; 43f857971dSopenharmony_ci 44f857971dSopenharmony_cinamespace OHOS { 45f857971dSopenharmony_ci 46f857971dSopenharmony_citemplate <class T> T GetData() 47f857971dSopenharmony_ci{ 48f857971dSopenharmony_ci T objetct{}; 49f857971dSopenharmony_ci size_t objetctSize = sizeof(objetct); 50f857971dSopenharmony_ci if (g_baseFuzzData == nullptr || objetctSize > g_baseFuzzSize - g_baseFuzzPos) { 51f857971dSopenharmony_ci return objetct; 52f857971dSopenharmony_ci } 53f857971dSopenharmony_ci errno_t ret = memcpy_s(&objetct, objetctSize, g_baseFuzzData + g_baseFuzzPos, objetctSize); 54f857971dSopenharmony_ci if (ret != EOK) { 55f857971dSopenharmony_ci return {}; 56f857971dSopenharmony_ci } 57f857971dSopenharmony_ci g_baseFuzzPos += objetctSize; 58f857971dSopenharmony_ci return objetct; 59f857971dSopenharmony_ci} 60f857971dSopenharmony_ci 61f857971dSopenharmony_ci 62f857971dSopenharmony_cibool SocketClientFuzzTest(const uint8_t* data, size_t size) 63f857971dSopenharmony_ci{ 64f857971dSopenharmony_ci std::shared_ptr<ITunnelClient> tunnel = std::make_shared<TunnelClient>(); 65f857971dSopenharmony_ci SocketClient socketClient(tunnel); 66f857971dSopenharmony_ci auto callback = [](const StreamClient &client, NetPacket &pkt) { 67f857971dSopenharmony_ci return 0; 68f857971dSopenharmony_ci }; 69f857971dSopenharmony_ci 70f857971dSopenharmony_ci NetPacket packet(MessageId::INVALID); 71f857971dSopenharmony_ci 72f857971dSopenharmony_ci socketClient.Start(); 73f857971dSopenharmony_ci socketClient.RegisterEvent(MessageId::INVALID, callback); 74f857971dSopenharmony_ci socketClient.OnMsgHandler(socketClient, packet); 75f857971dSopenharmony_ci socketClient.Socket(); 76f857971dSopenharmony_ci socketClient.OnPacket(packet); 77f857971dSopenharmony_ci socketClient.Connect(); 78f857971dSopenharmony_ci socketClient.Reconnect(); 79f857971dSopenharmony_ci socketClient.OnDisconnected(); 80f857971dSopenharmony_ci socketClient.Stop(); 81f857971dSopenharmony_ci return true; 82f857971dSopenharmony_ci} 83f857971dSopenharmony_ci 84f857971dSopenharmony_cibool SocketConnectionFuzzTest(const uint8_t* data, size_t size) 85f857971dSopenharmony_ci{ 86f857971dSopenharmony_ci if ((data == nullptr) || (size < 1)) { 87f857971dSopenharmony_ci return false; 88f857971dSopenharmony_ci } 89f857971dSopenharmony_ci 90f857971dSopenharmony_ci auto recv = [](const NetPacket &pkt) { 91f857971dSopenharmony_ci return; 92f857971dSopenharmony_ci }; 93f857971dSopenharmony_ci auto onDisconnected = []() { 94f857971dSopenharmony_ci return; 95f857971dSopenharmony_ci }; 96f857971dSopenharmony_ci g_baseFuzzData = data; 97f857971dSopenharmony_ci g_baseFuzzSize = size; 98f857971dSopenharmony_ci g_baseFuzzPos = 0; 99f857971dSopenharmony_ci int32_t fd = GetData<int32_t>(); 100f857971dSopenharmony_ci SocketConnection socketConnection(1, recv, onDisconnected); 101f857971dSopenharmony_ci 102f857971dSopenharmony_ci auto socket = []() { 103f857971dSopenharmony_ci return 0; 104f857971dSopenharmony_ci }; 105f857971dSopenharmony_ci socketConnection.OnReadable(fd); 106f857971dSopenharmony_ci socketConnection.OnShutdown(fd); 107f857971dSopenharmony_ci socketConnection.OnException(fd); 108f857971dSopenharmony_ci Msdp::DeviceStatus::SocketConnection::Connect(socket, recv, onDisconnected); 109f857971dSopenharmony_ci return true; 110f857971dSopenharmony_ci} 111f857971dSopenharmony_ci 112f857971dSopenharmony_cibool SocketParamsFuzzTest(const uint8_t* data, size_t size) 113f857971dSopenharmony_ci{ 114f857971dSopenharmony_ci MessageParcel datas; 115f857971dSopenharmony_ci if (!datas.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN) || 116f857971dSopenharmony_ci !datas.WriteBuffer(data, size) || !datas.RewindRead(0)) { 117f857971dSopenharmony_ci return false; 118f857971dSopenharmony_ci } 119f857971dSopenharmony_ci AllocSocketPairParam allocSocketPairParam("testProgramName", 1); 120f857971dSopenharmony_ci AllocSocketPairReply allocSocketPairReply(1, 1); 121f857971dSopenharmony_ci 122f857971dSopenharmony_ci allocSocketPairParam.Marshalling(datas); 123f857971dSopenharmony_ci allocSocketPairParam.Unmarshalling(datas); 124f857971dSopenharmony_ci allocSocketPairReply.Marshalling(datas); 125f857971dSopenharmony_ci allocSocketPairReply.Unmarshalling(datas); 126f857971dSopenharmony_ci return true; 127f857971dSopenharmony_ci} 128f857971dSopenharmony_ci 129f857971dSopenharmony_ci 130f857971dSopenharmony_cibool SocketSessionFuzzTest(const uint8_t* data, size_t size) 131f857971dSopenharmony_ci{ 132f857971dSopenharmony_ci NetPacket packet(MessageId::COORDINATION_ADD_LISTENER); 133f857971dSopenharmony_ci struct epoll_event ev{}; 134f857971dSopenharmony_ci 135f857971dSopenharmony_ci SocketSession socketSession("testProgramName", 1, 1, 1, 1, 1); 136f857971dSopenharmony_ci socketSession.SendMsg(packet); 137f857971dSopenharmony_ci socketSession.ToString(); 138f857971dSopenharmony_ci socketSession.Dispatch(ev); 139f857971dSopenharmony_ci return true; 140f857971dSopenharmony_ci} 141f857971dSopenharmony_ci 142f857971dSopenharmony_ci} // namespace OHOS 143f857971dSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 144f857971dSopenharmony_ci{ 145f857971dSopenharmony_ci /* Run your code on data */ 146f857971dSopenharmony_ci if (data == nullptr) { 147f857971dSopenharmony_ci return 0; 148f857971dSopenharmony_ci } 149f857971dSopenharmony_ci 150f857971dSopenharmony_ci OHOS::SocketClientFuzzTest(data, size); 151f857971dSopenharmony_ci OHOS::SocketConnectionFuzzTest(data, size); 152f857971dSopenharmony_ci OHOS::SocketParamsFuzzTest(data, size); 153f857971dSopenharmony_ci OHOS::SocketSessionFuzzTest(data, size); 154f857971dSopenharmony_ci return 0; 155f857971dSopenharmony_ci} 156f857971dSopenharmony_ci} // namespace DeviceStatus 157f857971dSopenharmony_ci} // namespace Msdp 158f857971dSopenharmony_ci} // namespace OHOS