aboutsummaryrefslogtreecommitdiff
path: root/src/policy/policy.cpp
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2016-01-22 11:39:28 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2016-01-22 11:39:58 +0100
commitf4b2ce8ee8630789922a14cd9ee9037d96dba1b1 (patch)
treec6a98caefe0ecdc699239289ced6b9e648a73c04 /src/policy/policy.cpp
parent7726c487f80753477ae7f205d52395abfd2fb5f4 (diff)
parent52b29dca7670c3f6d2ab918c0fff1d17c4e494ad (diff)
downloadbitcoin-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.cpp37
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;