aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Chow <achow101-github@achow101.com>2017-05-30 15:42:10 -0700
committerAndrew Chow <achow101-github@achow101.com>2017-06-07 12:40:01 -0700
commit5b75c477841fa463aad9c6e6d95a98b50ce14dd3 (patch)
treeb1d8f572c189d1eb8af6aa324a002b1ee3a299aa
parent9fec4da0bec93a49798b5f5e92cf76e900759ee4 (diff)
downloadbitcoin-5b75c477841fa463aad9c6e6d95a98b50ce14dd3.tar.xz
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
-rw-r--r--src/script/script.cpp12
-rw-r--r--src/script/script.h3
-rw-r--r--src/test/script_tests.cpp14
3 files changed, 29 insertions, 0 deletions
diff --git a/src/script/script.cpp b/src/script/script.cpp
index 70eb8a139b..a71fee19cf 100644
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -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;
+}
diff --git a/src/script/script.h b/src/script/script.h
index 95a5999a13..25b80ef62b 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -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
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index 343c645cb1..70544cacd6 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -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()