From d26a84e18b1b74440fbdd5ddfa7bda651cde4e5e Mon Sep 17 00:00:00 2001 From: Mohamed Awnallah Date: Fri, 16 May 2025 08:51:15 +0000 Subject: [PATCH] server.go: prevent partial mutation of currNodeAnn In this commit, we prevent partial mutation of current node announcement during announcement signing. If node announcement signing failed the current node announcement becomes inconsistent. --- server.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server.go b/server.go index 81cffee3e..9c6a08395 100644 --- a/server.go +++ b/server.go @@ -3432,6 +3432,11 @@ func (s *server) genNodeAnnouncement(features *lnwire.RawFeatureVector, s.mu.Lock() defer s.mu.Unlock() + // Create a shallow copy of the current node announcement to work on. + // This ensures the original announcement remains unchanged + // until the new announcement is fully signed and valid. + newNodeAnn := *s.currentNodeAnn + // First, try to update our feature manager with the updated set of // features. if features != nil { @@ -3457,17 +3462,20 @@ func (s *server) genNodeAnnouncement(features *lnwire.RawFeatureVector, // Apply the requested changes to the node announcement. for _, modifier := range modifiers { - modifier(s.currentNodeAnn) + modifier(&newNodeAnn) } // Sign a new update after applying all of the passed modifiers. err := netann.SignNodeAnnouncement( - s.nodeSigner, s.identityKeyLoc, s.currentNodeAnn, + s.nodeSigner, s.identityKeyLoc, &newNodeAnn, ) if err != nil { return lnwire.NodeAnnouncement{}, err } + // If signing succeeds, update the current announcement. + *s.currentNodeAnn = newNodeAnn + return *s.currentNodeAnn, nil }