From a9db1e9a26a22005beedb7261d73dde3e26ce941 Mon Sep 17 00:00:00 2001 From: Rob Murray Date: Thu, 11 Sep 2025 09:55:47 +0100 Subject: [PATCH] Endpoint.sbLeave: don't load ep from store Because it loaded the Endpoint object from store and operated on that copy rather than its own receiver, sbJoin couldn't successfully roll back on error if the Endpoint was not included in the Sandbox's list of endpoints, or its current state had not been written to store after the error occurred. So, for example, releaseOSSboxResources() would not be called to delete interfaces created in the container's netns. Signed-off-by: Rob Murray --- daemon/libnetwork/default_gateway.go | 2 +- daemon/libnetwork/endpoint.go | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/daemon/libnetwork/default_gateway.go b/daemon/libnetwork/default_gateway.go index bbe0145843..078fd7c48e 100644 --- a/daemon/libnetwork/default_gateway.go +++ b/daemon/libnetwork/default_gateway.go @@ -100,7 +100,7 @@ func (sb *Sandbox) clearDefaultGW() error { if ep = sb.getEndpointInGWNetwork(); ep == nil { return nil } - if err := ep.sbLeave(context.TODO(), sb, false); err != nil { + if err := ep.sbLeave(context.TODO(), sb, ep.getNetwork(), false); err != nil { return fmt.Errorf("container %s: endpoint leaving GW Network failed: %v", sb.containerID, err) } if err := ep.Delete(context.TODO(), false); err != nil { diff --git a/daemon/libnetwork/endpoint.go b/daemon/libnetwork/endpoint.go index 598d5915c8..e342f65d1d 100644 --- a/daemon/libnetwork/endpoint.go +++ b/daemon/libnetwork/endpoint.go @@ -753,20 +753,20 @@ func (ep *Endpoint) Leave(ctx context.Context, sb *Sandbox) error { sb.joinLeaveMu.Lock() defer sb.joinLeaveMu.Unlock() - return ep.sbLeave(ctx, sb, false) -} - -func (ep *Endpoint) sbLeave(ctx context.Context, sb *Sandbox, force bool) error { n, err := ep.getNetworkFromStore() if err != nil { return fmt.Errorf("failed to get network from store during leave: %v", err) } - ep, err = n.getEndpointFromStore(ep.ID()) + storedEp, err := n.getEndpointFromStore(ep.ID()) if err != nil { return fmt.Errorf("failed to get endpoint from store during leave: %v", err) } + return storedEp.sbLeave(ctx, sb, n, false) +} + +func (ep *Endpoint) sbLeave(ctx context.Context, sb *Sandbox, n *Network, force bool) error { ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{ "nid": n.ID(), "net": n.Name(), @@ -920,7 +920,7 @@ func (ep *Endpoint) Delete(ctx context.Context, force bool) error { } if sb != nil { - if e := ep.sbLeave(context.WithoutCancel(ctx), sb, force); e != nil { + if e := ep.sbLeave(context.WithoutCancel(ctx), sb, n, force); e != nil { log.G(ctx).Warnf("failed to leave sandbox for endpoint %s : %v", name, e) } }