From fa1471e5754484f997ddf9db70888679dcd1d64a Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 11 Jul 2023 15:44:43 +0200 Subject: [PATCH 1/2] refactor: Remove duplicate allNetMessageTypesVec With C++11 (and later), the duplicate variable is no longer needed. Also, run clang-format on the namespace, as the script in the next commit relies on a specific format. This prevents a clang-format run in the future from breaking the script. (Review hint: --ignore-all-space). --- src/protocol.cpp | 75 ++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/protocol.cpp b/src/protocol.cpp index 5ecaabec367..2105480c72a 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -12,47 +12,47 @@ static std::atomic g_initial_block_download_completed(false); namespace NetMsgType { -const char *VERSION="version"; -const char *VERACK="verack"; -const char *ADDR="addr"; -const char *ADDRV2="addrv2"; -const char *SENDADDRV2="sendaddrv2"; -const char *INV="inv"; -const char *GETDATA="getdata"; -const char *MERKLEBLOCK="merkleblock"; -const char *GETBLOCKS="getblocks"; -const char *GETHEADERS="getheaders"; -const char *TX="tx"; -const char *HEADERS="headers"; -const char *BLOCK="block"; -const char *GETADDR="getaddr"; -const char *MEMPOOL="mempool"; -const char *PING="ping"; -const char *PONG="pong"; -const char *NOTFOUND="notfound"; -const char *FILTERLOAD="filterload"; -const char *FILTERADD="filteradd"; -const char *FILTERCLEAR="filterclear"; -const char *SENDHEADERS="sendheaders"; -const char *FEEFILTER="feefilter"; -const char *SENDCMPCT="sendcmpct"; -const char *CMPCTBLOCK="cmpctblock"; -const char *GETBLOCKTXN="getblocktxn"; -const char *BLOCKTXN="blocktxn"; -const char *GETCFILTERS="getcfilters"; -const char *CFILTER="cfilter"; -const char *GETCFHEADERS="getcfheaders"; -const char *CFHEADERS="cfheaders"; -const char *GETCFCHECKPT="getcfcheckpt"; -const char *CFCHECKPT="cfcheckpt"; -const char *WTXIDRELAY="wtxidrelay"; -const char *SENDTXRCNCL="sendtxrcncl"; +const char* VERSION = "version"; +const char* VERACK = "verack"; +const char* ADDR = "addr"; +const char* ADDRV2 = "addrv2"; +const char* SENDADDRV2 = "sendaddrv2"; +const char* INV = "inv"; +const char* GETDATA = "getdata"; +const char* MERKLEBLOCK = "merkleblock"; +const char* GETBLOCKS = "getblocks"; +const char* GETHEADERS = "getheaders"; +const char* TX = "tx"; +const char* HEADERS = "headers"; +const char* BLOCK = "block"; +const char* GETADDR = "getaddr"; +const char* MEMPOOL = "mempool"; +const char* PING = "ping"; +const char* PONG = "pong"; +const char* NOTFOUND = "notfound"; +const char* FILTERLOAD = "filterload"; +const char* FILTERADD = "filteradd"; +const char* FILTERCLEAR = "filterclear"; +const char* SENDHEADERS = "sendheaders"; +const char* FEEFILTER = "feefilter"; +const char* SENDCMPCT = "sendcmpct"; +const char* CMPCTBLOCK = "cmpctblock"; +const char* GETBLOCKTXN = "getblocktxn"; +const char* BLOCKTXN = "blocktxn"; +const char* GETCFILTERS = "getcfilters"; +const char* CFILTER = "cfilter"; +const char* GETCFHEADERS = "getcfheaders"; +const char* CFHEADERS = "cfheaders"; +const char* GETCFCHECKPT = "getcfcheckpt"; +const char* CFCHECKPT = "cfcheckpt"; +const char* WTXIDRELAY = "wtxidrelay"; +const char* SENDTXRCNCL = "sendtxrcncl"; } // namespace NetMsgType /** All known message types. Keep this in the same order as the list of * messages above and in protocol.h. */ -const static std::string allNetMessageTypes[] = { +const static std::vector g_all_net_message_types{ NetMsgType::VERSION, NetMsgType::VERACK, NetMsgType::ADDR, @@ -89,7 +89,6 @@ const static std::string allNetMessageTypes[] = { NetMsgType::WTXIDRELAY, NetMsgType::SENDTXRCNCL, }; -const static std::vector allNetMessageTypesVec(std::begin(allNetMessageTypes), std::end(allNetMessageTypes)); CMessageHeader::CMessageHeader(const MessageStartChars& pchMessageStartIn, const char* pszCommand, unsigned int nMessageSizeIn) { @@ -182,7 +181,7 @@ std::string CInv::ToString() const const std::vector &getAllNetMessageTypes() { - return allNetMessageTypesVec; + return g_all_net_message_types; } /** From fa6245da6061050eb77ad07cd4caf8c596d89dc6 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 11 Jul 2023 15:48:42 +0200 Subject: [PATCH 2/2] fuzz: Generate process_message targets individually Also, add an "rpc" target without LIMIT_TO_RPC_COMMAND set. --- test/fuzz/test_runner.py | 53 +++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/test/fuzz/test_runner.py b/test/fuzz/test_runner.py index ef1583d4465..1ce7c713603 100755 --- a/test/fuzz/test_runner.py +++ b/test/fuzz/test_runner.py @@ -193,6 +193,42 @@ def main(): ) +def transform_process_message_target(targets, src_dir): + """Add a target per process message, and also keep ("process_message", {}) to allow for + cross-pollination, or unlimited search""" + + p2p_msg_target = "process_message" + if (p2p_msg_target, {}) in targets: + lines = subprocess.run( + ["git", "grep", "--function-context", "g_all_net_message_types{", src_dir / "src" / "protocol.cpp"], + check=True, + stdout=subprocess.PIPE, + text=True, + ).stdout.splitlines() + lines = [l.split("::", 1)[1].split(",")[0].lower() for l in lines if l.startswith("src/protocol.cpp- NetMsgType::")] + assert len(lines) + targets += [(p2p_msg_target, {"LIMIT_TO_MESSAGE_TYPE": m}) for m in lines] + return targets + + +def transform_rpc_target(targets, src_dir): + """Add a target per RPC command, and also keep ("rpc", {}) to allow for cross-pollination, + or unlimited search""" + + rpc_target = "rpc" + if (rpc_target, {}) in targets: + lines = subprocess.run( + ["git", "grep", "--function-context", "RPC_COMMANDS_SAFE_FOR_FUZZING{", src_dir / "src" / "test" / "fuzz" / "rpc.cpp"], + check=True, + stdout=subprocess.PIPE, + text=True, + ).stdout.splitlines() + lines = [l.split("\"", 1)[1].split("\"")[0] for l in lines if l.startswith("src/test/fuzz/rpc.cpp- \"")] + assert len(lines) + targets += [(rpc_target, {"LIMIT_TO_RPC_COMMAND": r}) for r in lines] + return targets + + def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets): """Generates new corpus. @@ -200,20 +236,9 @@ def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets): {corpus_dir}. """ logging.info("Generating corpus to {}".format(corpus_dir)) - rpc_target = "rpc" - has_rpc = rpc_target in targets - if has_rpc: - targets.remove(rpc_target) - targets = [(t, {}) for t in targets] - if has_rpc: - lines = subprocess.run( - ["git", "grep", "--function-context", "RPC_COMMANDS_SAFE_FOR_FUZZING{", os.path.join(src_dir, "src", "test", "fuzz", "rpc.cpp")], - check=True, - stdout=subprocess.PIPE, - text=True, - ).stdout.splitlines() - lines = [l.split("\"", 1)[1].split("\"")[0] for l in lines if l.startswith("src/test/fuzz/rpc.cpp- \"")] - targets += [(rpc_target, {"LIMIT_TO_RPC_COMMAND": r}) for r in lines] + targets = [(t, {}) for t in targets] # expand to add dictionary for target-specific env variables + targets = transform_process_message_target(targets, Path(src_dir)) + targets = transform_rpc_target(targets, Path(src_dir)) def job(command, t, t_env): logging.debug(f"Running '{command}'")