mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
fix recently observed crash on IsValid (#1375)
* fix recently observed crash on IsValid +some small cleanup * txin.prevout.n should not exceed txOutpointCreated.vout.size() * fix log output
This commit is contained in:
parent
295e94d66a
commit
1c63052c3e
@ -848,8 +848,8 @@ bool CTxLockRequest::IsValid(bool fRequireUnspent) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t nValueIn = 0;
|
CAmount nValueIn = 0;
|
||||||
int64_t nValueOut = 0;
|
CAmount nValueOut = 0;
|
||||||
|
|
||||||
BOOST_FOREACH(const CTxOut& txout, vout) {
|
BOOST_FOREACH(const CTxOut& txout, vout) {
|
||||||
// InstantSend supports normal scripts and unspendable (i.e. data) scripts.
|
// InstantSend supports normal scripts and unspendable (i.e. data) scripts.
|
||||||
@ -865,6 +865,8 @@ bool CTxLockRequest::IsValid(bool fRequireUnspent) const
|
|||||||
|
|
||||||
CCoins coins;
|
CCoins coins;
|
||||||
int nPrevoutHeight = 0;
|
int nPrevoutHeight = 0;
|
||||||
|
CAmount nValue = 0;
|
||||||
|
|
||||||
if(!pcoinsTip->GetCoins(txin.prevout.hash, coins) ||
|
if(!pcoinsTip->GetCoins(txin.prevout.hash, coins) ||
|
||||||
(unsigned int)txin.prevout.n>=coins.vout.size() ||
|
(unsigned int)txin.prevout.n>=coins.vout.size() ||
|
||||||
coins.vout[txin.prevout.n].IsNull()) {
|
coins.vout[txin.prevout.n].IsNull()) {
|
||||||
@ -875,20 +877,29 @@ bool CTxLockRequest::IsValid(bool fRequireUnspent) const
|
|||||||
CTransaction txOutpointCreated;
|
CTransaction txOutpointCreated;
|
||||||
uint256 nHashOutpointConfirmed;
|
uint256 nHashOutpointConfirmed;
|
||||||
if(!GetTransaction(txin.prevout.hash, txOutpointCreated, Params().GetConsensus(), nHashOutpointConfirmed, true) || nHashOutpointConfirmed == uint256()) {
|
if(!GetTransaction(txin.prevout.hash, txOutpointCreated, Params().GetConsensus(), nHashOutpointConfirmed, true) || nHashOutpointConfirmed == uint256()) {
|
||||||
LogPrint("instantsend", "txLockRequest::IsValid -- Failed to find outpoint %s\n", txin.prevout.ToStringShort());
|
LogPrint("instantsend", "CTxLockRequest::IsValid -- Failed to find outpoint %s\n", txin.prevout.ToStringShort());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(txin.prevout.n >= txOutpointCreated.vout.size()) {
|
||||||
|
LogPrint("instantsend", "CTxLockRequest::IsValid -- Outpoint %s is out of bounds, size() = %lld\n",
|
||||||
|
txin.prevout.ToStringShort(), txOutpointCreated.vout.size());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LOCK(cs_main);
|
|
||||||
BlockMap::iterator mi = mapBlockIndex.find(nHashOutpointConfirmed);
|
BlockMap::iterator mi = mapBlockIndex.find(nHashOutpointConfirmed);
|
||||||
if(mi == mapBlockIndex.end()) {
|
if(mi == mapBlockIndex.end() || !mi->second) {
|
||||||
// not on this chain?
|
// shouldn't happen
|
||||||
LogPrint("instantsend", "txLockRequest::IsValid -- Failed to find block %s for outpoint %s\n", nHashOutpointConfirmed.ToString(), txin.prevout.ToStringShort());
|
LogPrint("instantsend", "CTxLockRequest::IsValid -- Failed to find block %s for outpoint %s\n",
|
||||||
|
nHashOutpointConfirmed.ToString(), txin.prevout.ToStringShort());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
nPrevoutHeight = mi->second ? mi->second->nHeight : 0;
|
nPrevoutHeight = mi->second->nHeight;
|
||||||
|
nValue = txOutpointCreated.vout[txin.prevout.n].nValue;
|
||||||
|
} else {
|
||||||
|
nPrevoutHeight = coins.nHeight;
|
||||||
|
nValue = coins.vout[txin.prevout.n].nValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nTxAge = chainActive.Height() - (nPrevoutHeight ? nPrevoutHeight : coins.nHeight) + 1;
|
int nTxAge = chainActive.Height() - nPrevoutHeight + 1;
|
||||||
// 1 less than the "send IX" gui requires, in case of a block propagating the network at the time
|
// 1 less than the "send IX" gui requires, in case of a block propagating the network at the time
|
||||||
int nConfirmationsRequired = INSTANTSEND_CONFIRMATIONS_REQUIRED - 1;
|
int nConfirmationsRequired = INSTANTSEND_CONFIRMATIONS_REQUIRED - 1;
|
||||||
|
|
||||||
@ -898,7 +909,7 @@ bool CTxLockRequest::IsValid(bool fRequireUnspent) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nValueIn += coins.vout[txin.prevout.n].nValue;
|
nValueIn += nValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nValueOut > sporkManager.GetSporkValue(SPORK_5_INSTANTSEND_MAX_VALUE)*COIN) {
|
if(nValueOut > sporkManager.GetSporkValue(SPORK_5_INSTANTSEND_MAX_VALUE)*COIN) {
|
||||||
|
Loading…
Reference in New Issue
Block a user