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 { if !ok {
return nil, fmt.Errorf("unknown htlc %v", key) return nil, fmt.Errorf("unknown htlc %v", key)
} }
if htlc.State == HtlcStateSettled { if htlc.State != HtlcStateAccepted {
return nil, fmt.Errorf("cannot cancel a " + return nil, fmt.Errorf("can only cancel " +
"settled htlc") "accepted htlcs")
} }
htlc.State = HtlcStateCancelled htlc.State = HtlcStateCancelled

@ -640,7 +640,21 @@ func (i *InvoiceRegistry) CancelInvoice(payHash lntypes.Hash) error {
canceledHtlcs := make( canceledHtlcs := make(
map[channeldb.CircuitKey]*channeldb.HtlcAcceptDesc, 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 canceledHtlcs[key] = nil
} }