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