1 /*
2 * Copyright (c) 2022-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
16 #include "softbushidumper_fuzzer.h"
17
18 #include <securec.h>
19
20 #include "comm_log.h"
21 #include "fuzz_data_generator.h"
22 #include "message_handler.h"
23 #include "softbus_error_code.h"
24 #include "legacy/softbus_hidumper.h"
25 #include "legacy/softbus_hidumper_bc_mgr.h"
26 #include "legacy/softbus_hidumper_broadcast.h"
27 #include "legacy/softbus_hidumper_buscenter.h"
28 #include "legacy/softbus_hidumper_conn.h"
29 #include "legacy/softbus_hidumper_disc.h"
30 #include "legacy/softbus_hidumper_interface.h"
31 #include "legacy/softbus_hidumper_nstack.h"
32 #include "legacy/softbus_hidumper_trans.h"
33
34 namespace {
35 const char *DUMP_CMD = "test";
36
37 std::vector<const char *> CMD_ALARM = {"alert", "-l", DUMP_CMD};
38 std::vector<const char *> CMD_BCMGR = {"broadcastMgr", "-l", DUMP_CMD};
39 std::vector<const char *> CMD_BROADCAST = {"broadcast", "-l", DUMP_CMD};
40 std::vector<const char *> CMD_BUSCENTER = {"buscenter", "-l", DUMP_CMD};
41 std::vector<const char *> CMD_CONN = {"conn", "-l", DUMP_CMD};
42 std::vector<const char *> CMD_DISC = {"disc", "-l", DUMP_CMD};
43 std::vector<const char *> CMD_NSTACK_DSTREAM = {"dstream", "-l", DUMP_CMD};
44 std::vector<const char *> CMD_NSTACK_DFILE = {"dfile", "-l", DUMP_CMD};
45 std::vector<const char *> CMD_NSTACK_DFINDER = {"dfinder", "-l", DUMP_CMD};
46 std::vector<const char *> CMD_NSTACK_DMSG = {"dmsg", "-l", DUMP_CMD};
47 std::vector<const char *> CMD_STATS = {"stats", "-l", DUMP_CMD};
48 std::vector<const char *> CMD_TRANS = {"trans", "-l", DUMP_CMD};
49
50 const std::vector<std::vector<const char *>> DUMP_CMD_LIST = {CMD_ALARM, CMD_BCMGR, CMD_BROADCAST, CMD_BUSCENTER,
51 CMD_CONN, CMD_DISC, CMD_NSTACK_DSTREAM, CMD_NSTACK_DFILE, CMD_NSTACK_DFINDER, CMD_NSTACK_DMSG, CMD_STATS,
52 CMD_TRANS};
53
DoDump(void)54 void DoDump(void)
55 {
56 std::vector<const char *> dumpCmd;
57 if (!GenerateFromList(dumpCmd, DUMP_CMD_LIST) || dumpCmd.empty()) {
58 return;
59 }
60
61 SoftBusDumpDispatch(1, dumpCmd.size(), const_cast<const char **>(&dumpCmd[0]));
62 }
63
SoftBusVarDumpCallback(int32_t fd)64 static int32_t SoftBusVarDumpCallback(int32_t fd)
65 {
66 (void)fd;
67 return SOFTBUS_OK;
68 }
69
70 class TestEnv {
71 public:
TestEnv()72 TestEnv()
73 {
74 isInited_ = false;
75 int32_t ret = LooperInit();
76 COMM_CHECK_AND_RETURN_LOGE(ret == SOFTBUS_OK, COMM_TEST, "init looper failed");
77 ret = SoftBusHiDumperInit();
78 COMM_CHECK_AND_RETURN_LOGE(ret == SOFTBUS_OK, COMM_TEST, "init hidumper failed");
79
80 SoftBusRegBcMgrVarDump(DUMP_CMD, &SoftBusVarDumpCallback);
81 SoftBusRegBroadcastVarDump(DUMP_CMD, &SoftBusVarDumpCallback);
82 SoftBusRegBusCenterVarDump(const_cast<char *>(DUMP_CMD), &SoftBusVarDumpCallback);
83 SoftBusRegConnVarDump(DUMP_CMD, &SoftBusVarDumpCallback);
84 SoftBusRegDiscVarDump(const_cast<char *>(DUMP_CMD), &SoftBusVarDumpCallback);
85 SoftBusRegTransVarDump(DUMP_CMD, &SoftBusVarDumpCallback);
86 SoftBusRegConnVarDump(DUMP_CMD, &SoftBusVarDumpCallback);
87 isInited_ = true;
88 }
89
~TestEnv()90 ~TestEnv()
91 {
92 isInited_ = false;
93 LooperDeinit();
94 SoftBusHiDumperDeinit();
95 }
96
IsInited(void)97 bool IsInited(void)
98 {
99 return isInited_;
100 }
101
102 private:
103 volatile bool isInited_;
104 };
105 } // anonymous namespace
106
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)107 extern "C" int32_t LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
108 {
109 static TestEnv env;
110 if (!env.IsInited()) {
111 return 0;
112 }
113
114 DataGenerator::Write(data, size);
115 DoDump();
116 DataGenerator::Clear();
117 return 0;
118 }