projects
/
rust-lightning
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Abort if we add a duplicate input
[rust-lightning]
/
lightning
/
src
/
ln
/
interactivetxs.rs
diff --git
a/lightning/src/ln/interactivetxs.rs
b/lightning/src/ln/interactivetxs.rs
index 33a8bfc2f7c2f7a54e36dd438fec020a884ef9d4..836258b5893be6e5651f22572b0a3a7ca787da23 100644
(file)
--- a/
lightning/src/ln/interactivetxs.rs
+++ b/
lightning/src/ln/interactivetxs.rs
@@
-308,7
+308,10
@@
impl NegotiationContext {
};
let prev_output =
tx.output.get(msg.prevtx_out as usize).ok_or(AbortReason::PrevTxOutInvalid)?.clone();
};
let prev_output =
tx.output.get(msg.prevtx_out as usize).ok_or(AbortReason::PrevTxOutInvalid)?.clone();
- self.prevtx_outpoints.insert(input.previous_output);
+ if !self.prevtx_outpoints.insert(input.previous_output) {
+ // We have added an input that already exists
+ return Err(AbortReason::PrevTxOutInvalid);
+ }
self.inputs.insert(msg.serial_id, TxInputWithPrevOutput { input, prev_output });
Ok(())
}
self.inputs.insert(msg.serial_id, TxInputWithPrevOutput { input, prev_output });
Ok(())
}
@@
-1253,7
+1256,7
@@
mod tests {
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![],
outputs_b: vec![],
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![],
outputs_b: vec![],
- expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::Node
A
)),
+ expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::Node
B
)),
});
// Non-initiator uses same prevout as initiator.
let duplicate_input = TxIn {
});
// Non-initiator uses same prevout as initiator.
let duplicate_input = TxIn {
@@
-1266,7
+1269,7
@@
mod tests {
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![(duplicate_input.clone(), tx.clone())],
outputs_b: vec![],
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![(duplicate_input.clone(), tx.clone())],
outputs_b: vec![],
- expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::Node
B
)),
+ expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::Node
A
)),
});
// Initiator sends too many TxAddInputs
do_test_interactive_tx_constructor(TestSession {
});
// Initiator sends too many TxAddInputs
do_test_interactive_tx_constructor(TestSession {