1800b99b8Sopenharmony_ci/* 2800b99b8Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License. 5800b99b8Sopenharmony_ci * You may obtain a copy of the License at 6800b99b8Sopenharmony_ci * 7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8800b99b8Sopenharmony_ci * 9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and 13800b99b8Sopenharmony_ci * limitations under the License. 14800b99b8Sopenharmony_ci */ 15800b99b8Sopenharmony_ci 16800b99b8Sopenharmony_ci#include "faultloggerdserver_fuzzer.h" 17800b99b8Sopenharmony_ci 18800b99b8Sopenharmony_ci#include <cstddef> 19800b99b8Sopenharmony_ci#include <cstdint> 20800b99b8Sopenharmony_ci#include <unistd.h> 21800b99b8Sopenharmony_ci#include <sys/socket.h> 22800b99b8Sopenharmony_ci 23800b99b8Sopenharmony_ci#include "dfx_exception.h" 24800b99b8Sopenharmony_ci#include "dfx_util.h" 25800b99b8Sopenharmony_ci#include "faultloggerd_client.h" 26800b99b8Sopenharmony_ci#include "faultloggerd_fuzzertest_common.h" 27800b99b8Sopenharmony_ci#include "fault_logger_config.h" 28800b99b8Sopenharmony_ci#define private public 29800b99b8Sopenharmony_ci#include "fault_logger_daemon.h" 30800b99b8Sopenharmony_ci#undef private 31800b99b8Sopenharmony_ci 32800b99b8Sopenharmony_cinamespace OHOS { 33800b99b8Sopenharmony_cinamespace HiviewDFX { 34800b99b8Sopenharmony_ciconstexpr int32_t FAULTLOGGERD_FUZZ_READ_BUFF = 1024; 35800b99b8Sopenharmony_ci 36800b99b8Sopenharmony_civoid *ReadThread1(void *param) 37800b99b8Sopenharmony_ci{ 38800b99b8Sopenharmony_ci int fd = static_cast<int>(reinterpret_cast<long>(param)); 39800b99b8Sopenharmony_ci char buff[FAULTLOGGERD_FUZZ_READ_BUFF]; 40800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff))); 41800b99b8Sopenharmony_ci char msg[] = "any test str"; 42800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(msg), sizeof(msg))); 43800b99b8Sopenharmony_ci return nullptr; 44800b99b8Sopenharmony_ci} 45800b99b8Sopenharmony_ci 46800b99b8Sopenharmony_civoid *ReadThread2(void *param) 47800b99b8Sopenharmony_ci{ 48800b99b8Sopenharmony_ci int fd = static_cast<int>(reinterpret_cast<long>(param)); 49800b99b8Sopenharmony_ci char buff[FAULTLOGGERD_FUZZ_READ_BUFF]; 50800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff))); 51800b99b8Sopenharmony_ci CrashDumpException test; 52800b99b8Sopenharmony_ci test.error = CRASH_DUMP_LOCAL_REPORT; 53800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(&test), sizeof(CrashDumpException))); 54800b99b8Sopenharmony_ci return nullptr; 55800b99b8Sopenharmony_ci} 56800b99b8Sopenharmony_ci 57800b99b8Sopenharmony_civoid *ReadThread3(void *param) 58800b99b8Sopenharmony_ci{ 59800b99b8Sopenharmony_ci int fd = static_cast<int>(reinterpret_cast<long>(param)); 60800b99b8Sopenharmony_ci char buff[FAULTLOGGERD_FUZZ_READ_BUFF]; 61800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(read(fd, buff, sizeof(buff))); 62800b99b8Sopenharmony_ci CrashDumpException test{}; 63800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<char*>(&test), sizeof(CrashDumpException))); 64800b99b8Sopenharmony_ci return nullptr; 65800b99b8Sopenharmony_ci} 66800b99b8Sopenharmony_ci 67800b99b8Sopenharmony_civoid HandleRequestTestCommon(std::shared_ptr<FaultLoggerDaemon> daemon, char* buff, size_t len, 68800b99b8Sopenharmony_ci void *(*startRoutine)(void *)) 69800b99b8Sopenharmony_ci{ 70800b99b8Sopenharmony_ci int socketFd[2]; // 2 : the length of the array 71800b99b8Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) { 72800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], buff, len)); 73800b99b8Sopenharmony_ci daemon->connectionMap_[socketFd[0]] = socketFd[0]; 74800b99b8Sopenharmony_ci 75800b99b8Sopenharmony_ci if (!startRoutine) { 76800b99b8Sopenharmony_ci daemon->HandleRequest(0, socketFd[0]); 77800b99b8Sopenharmony_ci } else { 78800b99b8Sopenharmony_ci pthread_t threadId; 79800b99b8Sopenharmony_ci if (pthread_create(&threadId, nullptr, startRoutine, reinterpret_cast<void*>(socketFd[1])) != 0) { 80800b99b8Sopenharmony_ci perror("Failed to create thread"); 81800b99b8Sopenharmony_ci close(socketFd[0]); 82800b99b8Sopenharmony_ci close(socketFd[1]); 83800b99b8Sopenharmony_ci return; 84800b99b8Sopenharmony_ci } 85800b99b8Sopenharmony_ci 86800b99b8Sopenharmony_ci daemon->HandleRequest(0, socketFd[0]); 87800b99b8Sopenharmony_ci 88800b99b8Sopenharmony_ci pthread_join(threadId, nullptr); 89800b99b8Sopenharmony_ci } 90800b99b8Sopenharmony_ci close(socketFd[1]); 91800b99b8Sopenharmony_ci } 92800b99b8Sopenharmony_ci} 93800b99b8Sopenharmony_ci 94800b99b8Sopenharmony_cistd::vector<FaultLoggerdStatsRequest> InitStatsRequests(const uint8_t* data, size_t size) 95800b99b8Sopenharmony_ci{ 96800b99b8Sopenharmony_ci std::vector<FaultLoggerdStatsRequest> statsRequest; 97800b99b8Sopenharmony_ci { 98800b99b8Sopenharmony_ci FaultLoggerdStatsRequest requst{}; 99800b99b8Sopenharmony_ci requst.type = PROCESS_DUMP; 100800b99b8Sopenharmony_ci requst.signalTime = GetTimeMilliSeconds(); 101800b99b8Sopenharmony_ci requst.pid = 1; 102800b99b8Sopenharmony_ci requst.processdumpStartTime = time(nullptr); 103800b99b8Sopenharmony_ci requst.processdumpFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time 104800b99b8Sopenharmony_ci statsRequest.emplace_back(requst); 105800b99b8Sopenharmony_ci } 106800b99b8Sopenharmony_ci { 107800b99b8Sopenharmony_ci FaultLoggerdStatsRequest requst{}; 108800b99b8Sopenharmony_ci auto lastRequst = statsRequest.back(); 109800b99b8Sopenharmony_ci requst.type = DUMP_CATCHER; 110800b99b8Sopenharmony_ci requst.pid = lastRequst.pid; 111800b99b8Sopenharmony_ci requst.requestTime = time(nullptr); 112800b99b8Sopenharmony_ci requst.dumpCatcherFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time 113800b99b8Sopenharmony_ci requst.result = 1; 114800b99b8Sopenharmony_ci statsRequest.emplace_back(requst); 115800b99b8Sopenharmony_ci } 116800b99b8Sopenharmony_ci { 117800b99b8Sopenharmony_ci FaultLoggerdStatsRequest requst{}; 118800b99b8Sopenharmony_ci requst.type = DUMP_CATCHER; 119800b99b8Sopenharmony_ci requst.pid = 1; 120800b99b8Sopenharmony_ci requst.requestTime = time(nullptr); 121800b99b8Sopenharmony_ci requst.dumpCatcherFinishTime = time(nullptr) + 10; // 10 : Get the last 10 seconds of the current time 122800b99b8Sopenharmony_ci requst.result = 1; 123800b99b8Sopenharmony_ci statsRequest.emplace_back(requst); 124800b99b8Sopenharmony_ci } 125800b99b8Sopenharmony_ci return statsRequest; 126800b99b8Sopenharmony_ci} 127800b99b8Sopenharmony_ci 128800b99b8Sopenharmony_civoid HandleRequestByClientTypeForDefaultClientTest(std::shared_ptr<FaultLoggerDaemon> daemon) 129800b99b8Sopenharmony_ci{ 130800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 131800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::DEFAULT_CLIENT; 132800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 133800b99b8Sopenharmony_ci requst.type = FaultLoggerType::CPP_CRASH; 134800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 135800b99b8Sopenharmony_ci requst.type = FaultLoggerType::JS_HEAP_SNAPSHOT; 136800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 137800b99b8Sopenharmony_ci daemon->crashTimeMap_[1] = time(nullptr) - 10; // 10 : Get the first 10 seconds of the current time 138800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 139800b99b8Sopenharmony_ci daemon->crashTimeMap_[1] = time(nullptr); 140800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 141800b99b8Sopenharmony_ci} 142800b99b8Sopenharmony_ci 143800b99b8Sopenharmony_civoid HandleRequestByClientTypeTest(std::shared_ptr<FaultLoggerDaemon> daemon) 144800b99b8Sopenharmony_ci{ 145800b99b8Sopenharmony_ci HandleRequestByClientTypeForDefaultClientTest(daemon); 146800b99b8Sopenharmony_ci { 147800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 148800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::LOG_FILE_DES_CLIENT; 149800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 150800b99b8Sopenharmony_ci } 151800b99b8Sopenharmony_ci { 152800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 153800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::PRINT_T_HILOG_CLIENT; 154800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2); 155800b99b8Sopenharmony_ci } 156800b99b8Sopenharmony_ci { 157800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 158800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::PERMISSION_CLIENT; 159800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2); 160800b99b8Sopenharmony_ci } 161800b99b8Sopenharmony_ci { 162800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 163800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::SDK_DUMP_CLIENT; 164800b99b8Sopenharmony_ci requst.pid = 1; 165800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2); 166800b99b8Sopenharmony_ci } 167800b99b8Sopenharmony_ci { 168800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 169800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::PIPE_FD_CLIENT; 170800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 171800b99b8Sopenharmony_ci } 172800b99b8Sopenharmony_ci { 173800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 174800b99b8Sopenharmony_ci requst.clientType = FaultLoggerClientType::REPORT_EXCEPTION_CLIENT; 175800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread1); 176800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread2); 177800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), ReadThread3); 178800b99b8Sopenharmony_ci } 179800b99b8Sopenharmony_ci { 180800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 181800b99b8Sopenharmony_ci requst.clientType = -1; 182800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest), nullptr); 183800b99b8Sopenharmony_ci } 184800b99b8Sopenharmony_ci} 185800b99b8Sopenharmony_ci 186800b99b8Sopenharmony_civoid HandStaticTest(std::shared_ptr<FaultLoggerDaemon> daemon) 187800b99b8Sopenharmony_ci{ 188800b99b8Sopenharmony_ci daemon->HandleStaticForFuzzer(FaultLoggerType::CPP_STACKTRACE, 0); 189800b99b8Sopenharmony_ci daemon->HandleStaticForFuzzer(FaultLoggerType::JS_STACKTRACE, 0); 190800b99b8Sopenharmony_ci daemon->HandleStaticForFuzzer(FaultLoggerType::LEAK_STACKTRACE, 1); 191800b99b8Sopenharmony_ci daemon->HandleStaticForFuzzer(FaultLoggerType::FFRT_CRASH_LOG, 1); 192800b99b8Sopenharmony_ci daemon->HandleStaticForFuzzer(FaultLoggerType::JIT_CODE_LOG, 1); 193800b99b8Sopenharmony_ci} 194800b99b8Sopenharmony_ci 195800b99b8Sopenharmony_cibool CheckReadResp(int sockfd) 196800b99b8Sopenharmony_ci{ 197800b99b8Sopenharmony_ci char controlBuffer[SOCKET_BUFFER_SIZE] = {0}; 198800b99b8Sopenharmony_ci ssize_t nread = OHOS_TEMP_FAILURE_RETRY(read(sockfd, controlBuffer, sizeof(controlBuffer) - 1)); 199800b99b8Sopenharmony_ci if (nread != static_cast<ssize_t>(strlen(FAULTLOGGER_DAEMON_RESP))) { 200800b99b8Sopenharmony_ci return false; 201800b99b8Sopenharmony_ci } 202800b99b8Sopenharmony_ci return true; 203800b99b8Sopenharmony_ci} 204800b99b8Sopenharmony_ci 205800b99b8Sopenharmony_civoid HandleRequestByPipeTypeCommon(std::shared_ptr<FaultLoggerDaemon> daemon, int32_t pipeType, 206800b99b8Sopenharmony_ci bool isPassCheck = false, bool isJson = false) 207800b99b8Sopenharmony_ci{ 208800b99b8Sopenharmony_ci int fd = -1; 209800b99b8Sopenharmony_ci FaultLoggerdRequest request; 210800b99b8Sopenharmony_ci request.pipeType = pipeType; 211800b99b8Sopenharmony_ci std::unique_ptr<FaultLoggerPipe2> ptr = std::make_unique<FaultLoggerPipe2>(GetTimeMilliSeconds(), isJson); 212800b99b8Sopenharmony_ci 213800b99b8Sopenharmony_ci if (!isPassCheck) { 214800b99b8Sopenharmony_ci daemon->HandleRequestByPipeType(fd, 1, &request, ptr.get()); 215800b99b8Sopenharmony_ci close(fd); 216800b99b8Sopenharmony_ci return; 217800b99b8Sopenharmony_ci } 218800b99b8Sopenharmony_ci 219800b99b8Sopenharmony_ci int socketFd[2]; // 2 : the length of the array 220800b99b8Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) { 221800b99b8Sopenharmony_ci pid_t pid = fork(); 222800b99b8Sopenharmony_ci if (pid == 0) { 223800b99b8Sopenharmony_ci sleep(1); 224800b99b8Sopenharmony_ci if (CheckReadResp(socketFd[1])) { 225800b99b8Sopenharmony_ci std::string test = "test"; 226800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], test.c_str(), sizeof(test))); 227800b99b8Sopenharmony_ci } 228800b99b8Sopenharmony_ci } else if (pid > 0) { 229800b99b8Sopenharmony_ci daemon->connectionMap_[socketFd[0]] = socketFd[0]; 230800b99b8Sopenharmony_ci daemon->HandleRequestByPipeType(fd, socketFd[0], &request, ptr.get()); 231800b99b8Sopenharmony_ci close(fd); 232800b99b8Sopenharmony_ci close(socketFd[1]); 233800b99b8Sopenharmony_ci } 234800b99b8Sopenharmony_ci } 235800b99b8Sopenharmony_ci} 236800b99b8Sopenharmony_ci 237800b99b8Sopenharmony_civoid HandleRequestByPipeTypeTest(std::shared_ptr<FaultLoggerDaemon> daemon) 238800b99b8Sopenharmony_ci{ 239800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_BUF, true, false); 240800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_RES, true, false); 241800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_DELETE, true, false); 242800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF, true, true); 243800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_RES, true, true); 244800b99b8Sopenharmony_ci 245800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_BUF); 246800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_WRITE_BUF); 247800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_READ_RES); 248800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_WRITE_RES); 249800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_BUF, false, true); 250800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_WRITE_BUF, false, true); 251800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_READ_RES, false, true); 252800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, FaultLoggerPipeType::PIPE_FD_JSON_WRITE_RES, false, true); 253800b99b8Sopenharmony_ci HandleRequestByPipeTypeCommon(daemon, -1); 254800b99b8Sopenharmony_ci} 255800b99b8Sopenharmony_ci 256800b99b8Sopenharmony_civoid FaultloggerdServerTestCallOnce(const uint8_t* data, size_t size) 257800b99b8Sopenharmony_ci{ 258800b99b8Sopenharmony_ci static bool callCnt = false; 259800b99b8Sopenharmony_ci if (callCnt) { 260800b99b8Sopenharmony_ci return; 261800b99b8Sopenharmony_ci } 262800b99b8Sopenharmony_ci callCnt = true; 263800b99b8Sopenharmony_ci 264800b99b8Sopenharmony_ci std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>(); 265800b99b8Sopenharmony_ci // HandleRequest 266800b99b8Sopenharmony_ci daemon->HandleRequest(-1, 0); 267800b99b8Sopenharmony_ci 268800b99b8Sopenharmony_ci // HandleRequestTest 269800b99b8Sopenharmony_ci std::vector<FaultLoggerdStatsRequest> statsRequest = InitStatsRequests(data, size); 270800b99b8Sopenharmony_ci for (auto requst : statsRequest) { 271800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdStatsRequest), nullptr); 272800b99b8Sopenharmony_ci } 273800b99b8Sopenharmony_ci 274800b99b8Sopenharmony_ci // CheckReadRequest 275800b99b8Sopenharmony_ci { 276800b99b8Sopenharmony_ci int socketFd[2]; // 2 : the length of the array 277800b99b8Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) { 278800b99b8Sopenharmony_ci close(socketFd[1]); 279800b99b8Sopenharmony_ci daemon->HandleRequest(0, socketFd[0]); 280800b99b8Sopenharmony_ci } 281800b99b8Sopenharmony_ci } 282800b99b8Sopenharmony_ci char buff[] = "any test str"; 283800b99b8Sopenharmony_ci HandleRequestTestCommon(daemon, reinterpret_cast<char*>(buff), sizeof(buff), nullptr); 284800b99b8Sopenharmony_ci 285800b99b8Sopenharmony_ci // CheckRequestCredential 286800b99b8Sopenharmony_ci { 287800b99b8Sopenharmony_ci FaultLoggerdRequest requst; 288800b99b8Sopenharmony_ci int socketFd[2]; // 2 : the length of the array 289800b99b8Sopenharmony_ci if (socketpair(AF_UNIX, SOCK_STREAM, 0, socketFd) == 0) { 290800b99b8Sopenharmony_ci OHOS_TEMP_FAILURE_RETRY(write(socketFd[1], reinterpret_cast<char*>(&requst), sizeof(FaultLoggerdRequest))); 291800b99b8Sopenharmony_ci daemon->HandleRequest(0, socketFd[0]); 292800b99b8Sopenharmony_ci close(socketFd[1]); 293800b99b8Sopenharmony_ci } 294800b99b8Sopenharmony_ci } 295800b99b8Sopenharmony_ci 296800b99b8Sopenharmony_ci // init 297800b99b8Sopenharmony_ci if (!daemon->InitEnvironment()) { 298800b99b8Sopenharmony_ci daemon->CleanupSockets(); 299800b99b8Sopenharmony_ci return; 300800b99b8Sopenharmony_ci } 301800b99b8Sopenharmony_ci 302800b99b8Sopenharmony_ci HandleRequestByClientTypeTest(daemon); 303800b99b8Sopenharmony_ci HandleRequestByPipeTypeTest(daemon); 304800b99b8Sopenharmony_ci HandStaticTest(daemon); 305800b99b8Sopenharmony_ci} 306800b99b8Sopenharmony_ci 307800b99b8Sopenharmony_civoid FaultloggerdServerTest(const uint8_t* data, size_t size) 308800b99b8Sopenharmony_ci{ 309800b99b8Sopenharmony_ci std::shared_ptr<FaultLoggerDaemon> daemon = std::make_shared<FaultLoggerDaemon>(); 310800b99b8Sopenharmony_ci 311800b99b8Sopenharmony_ci int32_t epollFd; 312800b99b8Sopenharmony_ci int32_t connectionFd; 313800b99b8Sopenharmony_ci int32_t type; 314800b99b8Sopenharmony_ci int32_t pid; 315800b99b8Sopenharmony_ci int32_t tid; 316800b99b8Sopenharmony_ci int32_t uid; 317800b99b8Sopenharmony_ci 318800b99b8Sopenharmony_ci int offsetTotalLength = sizeof(epollFd) + sizeof(connectionFd) + sizeof(type) + sizeof(pid) + 319800b99b8Sopenharmony_ci sizeof(tid) + sizeof(uid); 320800b99b8Sopenharmony_ci if (offsetTotalLength > size) { 321800b99b8Sopenharmony_ci return; 322800b99b8Sopenharmony_ci } 323800b99b8Sopenharmony_ci 324800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, epollFd); 325800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, connectionFd); 326800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, type); 327800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, pid); 328800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, tid); 329800b99b8Sopenharmony_ci STREAM_TO_VALUEINFO(data, uid); 330800b99b8Sopenharmony_ci 331800b99b8Sopenharmony_ci if (epollFd < 0 || connectionFd < 3) { // 3: not allow fd = 0,1,2 because they are reserved by system 332800b99b8Sopenharmony_ci return; 333800b99b8Sopenharmony_ci } 334800b99b8Sopenharmony_ci 335800b99b8Sopenharmony_ci struct FaultLoggerdRequest request; 336800b99b8Sopenharmony_ci (void)memset_s(&request, sizeof(request), 0, sizeof(request)); 337800b99b8Sopenharmony_ci request.type = type; 338800b99b8Sopenharmony_ci request.pid = pid; 339800b99b8Sopenharmony_ci request.tid = tid; 340800b99b8Sopenharmony_ci request.uid = uid; 341800b99b8Sopenharmony_ci request.time = OHOS::HiviewDFX::GetTimeMilliSeconds(); 342800b99b8Sopenharmony_ci 343800b99b8Sopenharmony_ci daemon->HandleRequestForFuzzer(epollFd, connectionFd, &request, &request); 344800b99b8Sopenharmony_ci sleep(1); 345800b99b8Sopenharmony_ci} 346800b99b8Sopenharmony_ci} // namespace HiviewDFX 347800b99b8Sopenharmony_ci} // namespace OHOS 348800b99b8Sopenharmony_ci 349800b99b8Sopenharmony_ci/* Fuzzer entry point */ 350800b99b8Sopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 351800b99b8Sopenharmony_ci{ 352800b99b8Sopenharmony_ci if (data == nullptr || size == 0) { 353800b99b8Sopenharmony_ci return 0; 354800b99b8Sopenharmony_ci } 355800b99b8Sopenharmony_ci 356800b99b8Sopenharmony_ci /* Run your code on data */ 357800b99b8Sopenharmony_ci OHOS::HiviewDFX::FaultloggerdServerTestCallOnce(data, size); 358800b99b8Sopenharmony_ci OHOS::HiviewDFX::FaultloggerdServerTest(data, size); 359800b99b8Sopenharmony_ci return 0; 360800b99b8Sopenharmony_ci} 361