From 5e3b239ebccdabe6c6a270362cc246fbd64ef347 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 22 May 2018 16:46:55 -0700 Subject: [PATCH] htlcswitch: ensure we don't attempt to create fwding events for fails In this commit, we fix an existing source of a panic, that could at times lead to a deadlock. If the circuit returned from closeCircuit didn't have an outgoing key (as it was an incomplete forward), then we would attempt to de-ref a nil pointer. This would trigger a panic, and the runtime would start to unwind the stack, and execute each defer in line. A deadlock can arise here, as in the defer at the root goroutine, we need to grab the fwdingEventMtx. However, we already have it at the panic site. We fix this issue by ensuring we only attempt to add the event if it's a _settle_ and also actually has an outgoing circuit (which it should already, just a defensive check). --- htlcswitch/switch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htlcswitch/switch.go b/htlcswitch/switch.go index 94c424a2..52a24035 100644 --- a/htlcswitch/switch.go +++ b/htlcswitch/switch.go @@ -1061,7 +1061,7 @@ func (s *Switch) handlePacketForward(packet *htlcPacket) error { fail.Reason, ) } - } else { + } else if !isFail && circuit.Outgoing != nil { // If this is an HTLC settle, and it wasn't from a // locally initiated HTLC, then we'll log a forwarding // event so we can flush it to disk later.