From 7b481f015a0386f5ee3e13415474952653ddc198 Mon Sep 17 00:00:00 2001 From: Jeremy Rubin Date: Thu, 2 Sep 2021 20:58:09 -0700 Subject: [PATCH] Fix Racy ParseOpCode function initialization --- src/core_read.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/core_read.cpp b/src/core_read.cpp index 484f41f262c..1f9227bf0bc 100644 --- a/src/core_read.cpp +++ b/src/core_read.cpp @@ -21,13 +21,15 @@ #include namespace { - -opcodetype ParseOpCode(const std::string& s) +class OpCodeParser { - static std::map mapOpNames; +private: + std::map mapOpNames; - if (mapOpNames.empty()) { - for (unsigned int op = 0; op <= MAX_OPCODE; op++) { +public: + OpCodeParser() + { + for (unsigned int op = 0; op <= MAX_OPCODE; ++op) { // Allow OP_RESERVED to get into mapOpNames if (op < OP_NOP && op != OP_RESERVED) { continue; @@ -44,10 +46,18 @@ opcodetype ParseOpCode(const std::string& s) } } } + opcodetype Parse(const std::string& s) const + { + auto it = mapOpNames.find(s); + if (it == mapOpNames.end()) throw std::runtime_error("script parse error: unknown opcode"); + return it->second; + } +}; - auto it = mapOpNames.find(s); - if (it == mapOpNames.end()) throw std::runtime_error("script parse error: unknown opcode"); - return it->second; +opcodetype ParseOpCode(const std::string& s) +{ + static const OpCodeParser ocp; + return ocp.Parse(s); } } // namespace