• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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