channeldb+invoices: make htlc cancelation stricter

Previously it was possible to cancel a canceled htlc. This would
subtract the htlc amount from the invoice amount again.
This commit is contained in:
Joost Jager 2019-09-13 09:25:46 +02:00
parent 35d4652d23
commit 49a20a87a2
No known key found for this signature in database
GPG Key ID: A61B9D4C393C59C7
2 changed files with 18 additions and 4 deletions

@ -1224,9 +1224,9 @@ func (d *DB) updateInvoice(hash lntypes.Hash, invoices, settleIndex *bbolt.Bucke
if !ok {
return nil, fmt.Errorf("unknown htlc %v", key)
}
if htlc.State == HtlcStateSettled {
return nil, fmt.Errorf("cannot cancel a " +
"settled htlc")
if htlc.State != HtlcStateAccepted {
return nil, fmt.Errorf("can only cancel " +
"accepted htlcs")
}
htlc.State = HtlcStateCancelled

@ -640,7 +640,21 @@ func (i *InvoiceRegistry) CancelInvoice(payHash lntypes.Hash) error {
canceledHtlcs := make(
map[channeldb.CircuitKey]*channeldb.HtlcAcceptDesc,
)
for key := range invoice.Htlcs {
for key, htlc := range invoice.Htlcs {
switch htlc.State {
// If we get here, there shouldn't be any settled htlcs.
case channeldb.HtlcStateSettled:
return nil, errors.New("cannot cancel " +
"invoice with settled htlc(s)")
// Don't cancel htlcs that were already cancelled,
// because it would incorrectly modify the invoice paid
// amt.
case channeldb.HtlcStateCancelled:
continue
}
canceledHtlcs[key] = nil
}