diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2016-01-22 11:39:28 +0100 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2016-01-22 11:39:58 +0100 |
commit | f4b2ce8ee8630789922a14cd9ee9037d96dba1b1 (patch) | |
tree | c6a98caefe0ecdc699239289ced6b9e648a73c04 /src/policy/policy.cpp | |
parent | 7726c487f80753477ae7f205d52395abfd2fb5f4 (diff) | |
parent | 52b29dca7670c3f6d2ab918c0fff1d17c4e494ad (diff) | |
download | bitcoin-f4b2ce8ee8630789922a14cd9ee9037d96dba1b1.tar.xz |
Merge #7387: Get rid of inaccurate ScriptSigArgsExpected
52b29dc Get rid of inaccurate ScriptSigArgsExpected (Pieter Wuille)
Diffstat (limited to 'src/policy/policy.cpp')
-rw-r--r-- | src/policy/policy.cpp | 37 |
1 files changed, 6 insertions, 31 deletions
diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 273a482fa1..c92a249c17 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -135,45 +135,20 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) const CScript& prevScript = prev.scriptPubKey; if (!Solver(prevScript, whichType, vSolutions)) return false; - int nArgsExpected = ScriptSigArgsExpected(whichType, vSolutions); - if (nArgsExpected < 0) - return false; - - // Transactions with extra stuff in their scriptSigs are - // non-standard. Note that this EvalScript() call will - // be quick, because if there are any operations - // beside "push data" in the scriptSig - // IsStandardTx() will have already returned false - // and this method isn't called. - std::vector<std::vector<unsigned char> > stack; - if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker())) - return false; if (whichType == TX_SCRIPTHASH) { + std::vector<std::vector<unsigned char> > stack; + // convert the scriptSig into a stack, so we can inspect the redeemScript + if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), 0)) + return false; if (stack.empty()) return false; CScript subscript(stack.back().begin(), stack.back().end()); - std::vector<std::vector<unsigned char> > vSolutions2; - txnouttype whichType2; - if (Solver(subscript, whichType2, vSolutions2)) - { - int tmpExpected = ScriptSigArgsExpected(whichType2, vSolutions2); - if (tmpExpected < 0) - return false; - nArgsExpected += tmpExpected; - } - else - { - // Any other Script with less than 15 sigops OK: - unsigned int sigops = subscript.GetSigOpCount(true); - // ... extra data left on the stack after execution is OK, too: - return (sigops <= MAX_P2SH_SIGOPS); + if (subscript.GetSigOpCount(true) > MAX_P2SH_SIGOPS) { + return false; } } - - if (stack.size() != (unsigned int)nArgsExpected) - return false; } return true; |