Skip to content

Commit a53f0fe

Browse files
committed
Add some checks for invalid recursion in IsMine
1 parent b5802a9 commit a53f0fe

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

src/script/ismine.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
7676
break;
7777
case TX_WITNESS_V0_KEYHASH:
7878
{
79+
if (sigversion == IsMineSigVersion::WITNESS_V0) {
80+
// P2WPKH inside P2WSH is invalid.
81+
isInvalid = true;
82+
return ISMINE_NO;
83+
}
7984
if (sigversion == IsMineSigVersion::TOP && !keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) {
8085
// We do not support bare witness outputs unless the P2SH version of it would be
8186
// acceptable as well. This protects against matching before segwit activates.
@@ -100,6 +105,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
100105
break;
101106
case TX_SCRIPTHASH:
102107
{
108+
if (sigversion != IsMineSigVersion::TOP) {
109+
// P2SH inside P2WSH or P2SH is invalid.
110+
isInvalid = true;
111+
return ISMINE_NO;
112+
}
103113
CScriptID scriptID = CScriptID(uint160(vSolutions[0]));
104114
CScript subscript;
105115
if (keystore.GetCScript(scriptID, subscript)) {
@@ -109,6 +119,11 @@ isminetype IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey, b
109119
}
110120
case TX_WITNESS_V0_SCRIPTHASH:
111121
{
122+
if (sigversion == IsMineSigVersion::WITNESS_V0) {
123+
// P2WSH inside P2WSH is invalid.
124+
isInvalid = true;
125+
return ISMINE_NO;
126+
}
112127
if (sigversion == IsMineSigVersion::TOP && !keystore.HaveCScript(CScriptID(CScript() << OP_0 << vSolutions[0]))) {
113128
break;
114129
}

0 commit comments

Comments
 (0)