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