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 "faultloggerdserver_fuzzer.h"
16
17 #include <cstddef>
18 #include <cstdint>
19 #include <sys/socket.h>
20 #include <unistd.h>
21
22 #include "dfx_exception.h"
23 #include "dfx_socket_request.h"
24 #include "dfx_util.h"
25 #include "faultloggerd_client.h"
26 #include "fault_logger_daemon.h"
27 #include "faultloggerd_socket.h"
28 #include "faultloggerd_test.h"
29 #include "smart_fd.h"
30
31 namespace OHOS {
32 namespace HiviewDFX {
33
34 namespace {
SendMsgToServer(int32_t socketFd,const void * data,size_t msgLen)35 void SendMsgToServer(int32_t socketFd, const void* data, size_t msgLen)
36 {
37 std::string socketNames[] = { SERVER_SOCKET_NAME, SERVER_SDKDUMP_SOCKET_NAME, SERVER_CRASH_SOCKET_NAME };
38 srand(static_cast<unsigned>(time(nullptr)));
39 int randomSocketIndex = rand() % 3;
40 if (StartConnect(socketFd, socketNames[randomSocketIndex].c_str(), 0)) {
41 SendMsgToSocket(socketFd, data, msgLen);
42 }
43 }
44
GetFileDescriptorFromServer(int32_t socketFd,int32_t * fds,uint32_t nFds)45 bool GetFileDescriptorFromServer(int32_t socketFd, int32_t* fds, uint32_t nFds)
46 {
47 int32_t retCode{ResponseCode::RECEIVE_DATA_FAILED};
48 GetMsgFromSocket(socketFd, &retCode, sizeof (retCode));
49 if (retCode == ResponseCode::REQUEST_SUCCESS) {
50 return ReadFileDescriptorFromSocket(socketFd, fds, nFds);
51 }
52 return false;
53 }
54
FillRequestHeadData(RequestDataHead & head,FaultLoggerClientType clientType)55 void FillRequestHeadData(RequestDataHead& head, FaultLoggerClientType clientType)
56 {
57 head.clientType = clientType;
58 head.clientPid = getpid();
59 }
60 }
61
FaultLoggerdClientTest(const uint8_t * data,size_t size)62 void FaultLoggerdClientTest(const uint8_t* data, size_t size)
63 {
64 if (size < sizeof(FaultLoggerdRequest)) {
65 return;
66 }
67 FaultLoggerdRequest request = *reinterpret_cast<const FaultLoggerdRequest*>(data);
68 RequestFileDescriptor(request.type);
69 int pipeReadFd[PIPE_NUM_SZ] = {-1, -1};
70 RequestSdkDump(request.pid, request.tid, pipeReadFd);
71 CloseFd(pipeReadFd[PIPE_BUF_INDEX]);
72 CloseFd(pipeReadFd[PIPE_RES_INDEX]);
73 RequestPipeFd(request.pid, request.type, pipeReadFd);
74 CloseFd(pipeReadFd[PIPE_BUF_INDEX]);
75 CloseFd(pipeReadFd[PIPE_RES_INDEX]);
76 RequestDelPipeFd(request.pid);
77 RequestFileDescriptorEx(&request);
78 }
79
FaultLoggerdServerTest(const uint8_t * data,size_t size)80 void FaultLoggerdServerTest(const uint8_t* data, size_t size)
81 {
82 if (size < sizeof(FaultLoggerdRequest)) {
83 return;
84 }
85 SmartFd socketFd(CreateSocketFd());
86 SendMsgToServer(socketFd, data, size);
87 }
88
FileDesServiceTest(const uint8_t * data,size_t size)89 void FileDesServiceTest(const uint8_t* data, size_t size)
90 {
91 if (size < sizeof (FaultLoggerdRequest)) {
92 return;
93 }
94 FaultLoggerdRequest requestData = *reinterpret_cast<const FaultLoggerdRequest*>(data);
95 FillRequestHeadData(requestData.head, FaultLoggerClientType::LOG_FILE_DES_CLIENT);
96 SmartFd socketFd(CreateSocketFd());
97 SendMsgToServer(socketFd, &requestData, sizeof(FaultLoggerdRequest));
98 int32_t fd = -1;
99 if (GetFileDescriptorFromServer(socketFd, &fd, 1)) {
100 CloseFd(fd);
101 }
102 }
103
ExceptionReportServiceTest(const uint8_t * data,size_t size)104 void ExceptionReportServiceTest(const uint8_t* data, size_t size)
105 {
106 if (size < sizeof (CrashDumpException)) {
107 return;
108 }
109 CrashDumpException requestData = *reinterpret_cast<const CrashDumpException*>(data);
110 FillRequestHeadData(requestData.head, FaultLoggerClientType::REPORT_EXCEPTION_CLIENT);
111 SmartFd socketFd(CreateSocketFd());
112 SendMsgToServer(socketFd, &requestData, sizeof(CrashDumpException));
113 }
114
DumpStatsServiceTest(const uint8_t * data,size_t size)115 void DumpStatsServiceTest(const uint8_t* data, size_t size)
116 {
117 if (size < sizeof (FaultLoggerdStatsRequest)) {
118 return;
119 }
120 FaultLoggerdStatsRequest requestData = *reinterpret_cast<const FaultLoggerdStatsRequest*>(data);
121 FillRequestHeadData(requestData.head, FaultLoggerClientType::DUMP_STATS_CLIENT);
122 SmartFd socketFd(CreateSocketFd());
123 SendMsgToServer(socketFd, &requestData, sizeof(FaultLoggerdStatsRequest));
124 }
125
SdkDumpServiceTest(const uint8_t * data,size_t size)126 void SdkDumpServiceTest(const uint8_t* data, size_t size)
127 {
128 if (size < sizeof (SdkDumpRequestData)) {
129 return;
130 }
131 SdkDumpRequestData requestData = *reinterpret_cast<const SdkDumpRequestData*>(data);
132 FillRequestHeadData(requestData.head, FaultLoggerClientType::SDK_DUMP_CLIENT);
133 SmartFd socketFd(CreateSocketFd());
134 SendMsgToServer(socketFd, &requestData, sizeof(SdkDumpRequestData));
135 int32_t fds[PIPE_NUM_SZ] = {-1, -1};
136 if (GetFileDescriptorFromServer(socketFd, fds, PIPE_NUM_SZ)) {
137 CloseFd(fds[PIPE_BUF_INDEX]);
138 CloseFd(fds[PIPE_RES_INDEX]);
139 RequestDelPipeFd(requestData.pid);
140 }
141 }
142
PipServiceTest(const uint8_t * data,size_t size)143 void PipServiceTest(const uint8_t* data, size_t size)
144 {
145 if (size < sizeof (PipFdRequestData)) {
146 return;
147 }
148 PipFdRequestData requestData = *reinterpret_cast<const PipFdRequestData*>(data);
149 FillRequestHeadData(requestData.head, FaultLoggerClientType::PIPE_FD_CLIENT);
150 SmartFd socketFd(CreateSocketFd());
151 SendMsgToServer(socketFd, &requestData, sizeof(PipFdRequestData));
152 int32_t fds[PIPE_NUM_SZ] = {-1, -1};
153 if (GetFileDescriptorFromServer(socketFd, fds, PIPE_NUM_SZ)) {
154 CloseFd(fds[PIPE_BUF_INDEX]);
155 CloseFd(fds[PIPE_RES_INDEX]);
156 }
157 }
158
TempFileManagerTest(const uint8_t * data,size_t size)159 void TempFileManagerTest(const uint8_t* data, size_t size)
160 {
161 if (size < sizeof (FaultLoggerdRequest)) {
162 return;
163 }
164 const FaultLoggerdRequest& requestData = *reinterpret_cast<const FaultLoggerdRequest*>(data);
165 if (requestData.head.clientType & 1) {
166 SmartFd socketFd(OHOS::HiviewDFX::TempFileManager::CreateFileDescriptor(
167 FaultLoggerType::CPP_CRASH, requestData.pid, requestData.tid, requestData.time));
168 } else {
169 SmartFd socketFd(OHOS::HiviewDFX::TempFileManager::CreateFileDescriptor(
170 FaultLoggerType::JS_RAW_SNAPSHOT, requestData.pid, requestData.tid, requestData.time));
171 }
172 }
173 } // namespace HiviewDFX
174 } // namespace OHOS
175
176 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)177 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
178 {
179 FaultLoggerdTestServer::GetInstance();
180 if (data == nullptr || size == 0) {
181 return 0;
182 }
183 OHOS::HiviewDFX::FaultLoggerdClientTest(data, size);
184 OHOS::HiviewDFX::FaultLoggerdServerTest(data, size);
185 OHOS::HiviewDFX::FileDesServiceTest(data, size);
186 OHOS::HiviewDFX::ExceptionReportServiceTest(data, size);
187 OHOS::HiviewDFX::DumpStatsServiceTest(data, size);
188 OHOS::HiviewDFX::SdkDumpServiceTest(data, size);
189 OHOS::HiviewDFX::PipServiceTest(data, size);
190 OHOS::HiviewDFX::TempFileManagerTest(data, size);
191 return 0;
192 }
193