aboutsummaryrefslogtreecommitdiff
path: root/src/rpcrawtransaction.cpp
diff options
context:
space:
mode:
authorGregory Maxwell <[email protected]>2012-08-05 23:37:59 -0400
committerGregory Maxwell <[email protected]>2012-08-06 00:37:28 -0400
commit3557f99cf592be352cd2168157121a0cffbd6116 (patch)
treeb16365457c7b90fd8da80710c18e8c376c0446d0 /src/rpcrawtransaction.cpp
parentMerge pull request #1650 from Diapolo/spelling_fixes (diff)
downloaddiscoin-3557f99cf592be352cd2168157121a0cffbd6116.tar.xz
discoin-3557f99cf592be352cd2168157121a0cffbd6116.zip
Correctly handle missing inputs in signrawtransaction. Fixes #1654.
Signrawtransaction rpc was crashing when some inputs were unknown, and even with that fixed was failing to handle all the known inputs if there were unknown inputs in front of them. This commit instead attempts to fetch inputs one at a time.
Diffstat (limited to 'src/rpcrawtransaction.cpp')
-rw-r--r--src/rpcrawtransaction.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp
index 66e4d85f3..57cba15ec 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpcrawtransaction.cpp
@@ -321,18 +321,23 @@ Value signrawtransaction(const Array& params, bool fHelp)
// Fetch previous transactions (inputs):
map<COutPoint, CScript> mapPrevOut;
+ for (unsigned int i = 0; i < mergedTx.vin.size(); i++)
{
+ CTransaction tempTx;
MapPrevTx mapPrevTx;
CTxDB txdb("r");
map<uint256, CTxIndex> unused;
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:
- BOOST_FOREACH(const CTxIn& txin, mergedTx.vin)
+ BOOST_FOREACH(const CTxIn& txin, tempTx.vin)
{
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;
}
}