From 12c6345d3aa4c218e11c9bd4f8c85d2922a7a7a6 Mon Sep 17 00:00:00 2001 From: Cory Snider Date: Thu, 7 Aug 2025 13:25:37 -0400 Subject: [PATCH] libn/d/overlay: don't deref nil PeerRecord on error If unmarshaling the peer record fails, there is no need to check if it's a record for a local peer. Attempting to do so anyway will result in a nil-dereference panic. Don't do that. The Windows overlay driver has a typo: prevPeer is being checked twice for whether it was a local-peer record. Check prevPeer once and newPeer once each, as intended. Signed-off-by: Cory Snider --- daemon/libnetwork/drivers/overlay/joinleave.go | 6 ++---- .../libnetwork/drivers/windows/overlay/joinleave_windows.go | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/daemon/libnetwork/drivers/overlay/joinleave.go b/daemon/libnetwork/drivers/overlay/joinleave.go index fd8b6b9f43..2a722db5eb 100644 --- a/daemon/libnetwork/drivers/overlay/joinleave.go +++ b/daemon/libnetwork/drivers/overlay/joinleave.go @@ -174,8 +174,7 @@ func (d *driver) EventNotify(nid, tableName, key string, prev, value []byte) { prevPeer, err = UnmarshalPeerRecord(prev) if err != nil { log.G(context.TODO()).WithError(err).Error("Failed to unmarshal previous peer record") - } - if prevPeer.TunnelEndpointIP == d.advertiseAddress { + } else if prevPeer.TunnelEndpointIP == d.advertiseAddress { // Ignore local peers. We don't add them to the VXLAN // FDB so don't need to remove them. prevPeer = nil @@ -186,8 +185,7 @@ func (d *driver) EventNotify(nid, tableName, key string, prev, value []byte) { newPeer, err = UnmarshalPeerRecord(value) if err != nil { log.G(context.TODO()).WithError(err).Error("Failed to unmarshal peer record") - } - if newPeer.TunnelEndpointIP == d.advertiseAddress { + } else if newPeer.TunnelEndpointIP == d.advertiseAddress { newPeer = nil } } diff --git a/daemon/libnetwork/drivers/windows/overlay/joinleave_windows.go b/daemon/libnetwork/drivers/windows/overlay/joinleave_windows.go index 84fa39df01..fea79e1084 100644 --- a/daemon/libnetwork/drivers/windows/overlay/joinleave_windows.go +++ b/daemon/libnetwork/drivers/windows/overlay/joinleave_windows.go @@ -74,8 +74,7 @@ func (d *driver) EventNotify(nid, tableName, key string, prev, value []byte) { prevPeer, err = overlay.UnmarshalPeerRecord(prev) if err != nil { log.G(context.TODO()).WithError(err).Error("Failed to unmarshal previous peer record") - } - if prevPeer.TunnelEndpointIP.String() == n.providerAddress { + } else if prevPeer.TunnelEndpointIP.String() == n.providerAddress { // Ignore local peers. We don't add them to the VXLAN // FDB so don't need to remove them. prevPeer = nil @@ -86,8 +85,7 @@ func (d *driver) EventNotify(nid, tableName, key string, prev, value []byte) { newPeer, err = overlay.UnmarshalPeerRecord(value) if err != nil { log.G(context.TODO()).WithError(err).Error("Failed to unmarshal peer record") - } - if prevPeer.TunnelEndpointIP.String() == n.providerAddress { + } else if newPeer.TunnelEndpointIP.String() == n.providerAddress { newPeer = nil } }