Merge pull request #1655 from gmaxwell/signrawtransaction_fix_missing

Correctly handle missing inputs in signrawtransaction. Fixes #1654.
This commit is contained in:
Gregory Maxwell 2012-08-09 05:56:03 -07:00
commit 765654dae8

View file

@ -321,18 +321,23 @@ Value signrawtransaction(const Array& params, bool fHelp)
// Fetch previous transactions (inputs): // Fetch previous transactions (inputs):
map<COutPoint, CScript> mapPrevOut; map<COutPoint, CScript> mapPrevOut;
for (unsigned int i = 0; i < mergedTx.vin.size(); i++)
{ {
CTransaction tempTx;
MapPrevTx mapPrevTx; MapPrevTx mapPrevTx;
CTxDB txdb("r"); CTxDB txdb("r");
map<uint256, CTxIndex> unused; map<uint256, CTxIndex> unused;
bool fInvalid; bool fInvalid;
mergedTx.FetchInputs(txdb, unused, false, false, mapPrevTx, fInvalid);
// FetchInputs aborts on failure, so we go one at a time.
tempTx.vin.push_back(mergedTx.vin[i]);
tempTx.FetchInputs(txdb, unused, false, false, mapPrevTx, fInvalid);
// Copy results into mapPrevOut: // Copy results into mapPrevOut:
BOOST_FOREACH(const CTxIn& txin, mergedTx.vin) BOOST_FOREACH(const CTxIn& txin, tempTx.vin)
{ {
const uint256& prevHash = txin.prevout.hash; const uint256& prevHash = txin.prevout.hash;
if (mapPrevTx.count(prevHash)) if (mapPrevTx.count(prevHash) && mapPrevTx[prevHash].second.vout.size()>txin.prevout.n)
mapPrevOut[txin.prevout] = mapPrevTx[prevHash].second.vout[txin.prevout.n].scriptPubKey; mapPrevOut[txin.prevout] = mapPrevTx[prevHash].second.vout[txin.prevout.n].scriptPubKey;
} }
} }