From a53f0feff8d42b7a40d417f77dc8de682dd88fd9 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Tue, 1 May 2018 13:18:51 -0700 Subject: [PATCH] Add some checks for invalid recursion in IsMine --- src/script/ismine.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/script/ismine.cpp b/src/script/ismine.cpp index bebaf9ea8..2f710782f 100644 --- a/src/script/ismine.cpp +++ b/src/script/ismine.cpp @@ -76,6 +76,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b break; case TX_WITNESS_V0_KEYHASH: { + if (sigversion == IsMineSigVersion::WITNESS_V0) { + // P2WPKH inside P2WSH is invalid. + isInvalid = true; + return ISMINE_NO; + } if (sigversion == IsMineSigVersion::TOP && !keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) { // We do not support bare witness outputs unless the P2SH version of it would be // acceptable as well. This protects against matching before segwit activates. @@ -100,6 +105,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b break; case TX_SCRIPTHASH: { + if (sigversion != IsMineSigVersion::TOP) { + // P2SH inside P2WSH or P2SH is invalid. + isInvalid = true; + return ISMINE_NO; + } CScriptID scriptID = CScriptID(uint160(vSolutions[0])); CScript subscript; if (keystore.GetCScript(scriptID, subscript)) { @@ -109,6 +119,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b } case TX_WITNESS_V0_SCRIPTHASH: { + if (sigversion == IsMineSigVersion::WITNESS_V0) { + // P2WSH inside P2WSH is invalid. + isInvalid = true; + return ISMINE_NO; + } if (sigversion == IsMineSigVersion::TOP && !keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) { break; }