Browse Source

Add a valid opcode sanity check to CScript

Added a function in CScript that checks if the script contains valid opcodes.

Add a test for that function
pull/1/head
Andrew Chow 6 years ago
parent
commit
5b75c47784
  1. 12
      src/script/script.cpp
  2. 3
      src/script/script.h
  3. 14
      src/test/script_tests.cpp

12
src/script/script.cpp

@ -267,3 +267,15 @@ std::string CScriptWitness::ToString() const @@ -267,3 +267,15 @@ std::string CScriptWitness::ToString() const
}
return ret + ")";
}
bool CScript::HasValidOps() const
{
CScript::const_iterator it = begin();
while (it < end()) {
opcodetype opcode;
if (!GetOp(it, opcode) || opcode > 0xb9) {
return false;
}
}
return true;
}

3
src/script/script.h

@ -630,6 +630,9 @@ public: @@ -630,6 +630,9 @@ public:
bool IsPushOnly(const_iterator pc) const;
bool IsPushOnly() const;
/** Check if the script contains valid OP_CODES */
bool HasValidOps() const;
/**
* Returns whether the script is guaranteed to fail at execution,
* regardless of the initial stack. This allows outputs to be pruned

14
src/test/script_tests.cpp

@ -1438,4 +1438,18 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete) @@ -1438,4 +1438,18 @@ BOOST_AUTO_TEST_CASE(script_FindAndDelete)
BOOST_CHECK(s == expect);
}
BOOST_AUTO_TEST_CASE(script_HasValidOps)
{
// Exercise the HasValidOps functionality
CScript script;
script = ScriptFromHex("76a9141234567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac"); // Normal script
BOOST_CHECK(script.HasValidOps());
script = ScriptFromHex("76a914ff34567890abcdefa1a2a3a4a5a6a7a8a9a0aaab88ac");
BOOST_CHECK(script.HasValidOps());
script = ScriptFromHex("ff88ac"); // Script with OP_INVALIDOPCODE explicit
BOOST_CHECK(!script.HasValidOps());
script = ScriptFromHex("88acc0"); // Script with undefined opcode
BOOST_CHECK(!script.HasValidOps());
}
BOOST_AUTO_TEST_SUITE_END()

Loading…
Cancel
Save