diff --git a/docs/release-notes/release-notes-0.20.0.md b/docs/release-notes/release-notes-0.20.0.md index 2d63ccabb..ecbbc0b9b 100644 --- a/docs/release-notes/release-notes-0.20.0.md +++ b/docs/release-notes/release-notes-0.20.0.md @@ -20,6 +20,12 @@ # Bug Fixes +- Fixed potential update inconsistencies in node announcements [by creating + a shallow copy before modifications]( + https://github.com/lightningnetwork/lnd/pull/9815). This ensures the original + announcement remains unchanged until the new one is fully signed and + validated. + # New Features ## Functional Enhancements @@ -119,4 +125,5 @@ circuit. The indices are only available for forwarding events saved after v0.20. * Abdulkbk * Elle Mouton * Funyug +* Mohamed Awnallah * Pins 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 }