From 3f6e0ec94b7c70bcd31503fd003783901d0e5004 Mon Sep 17 00:00:00 2001 From: "K. Alex Mills" Date: Thu, 19 Nov 2020 15:28:30 -0600 Subject: [PATCH] fix: pass argument url in defer to avoid loopclosure Because of the well-known range loop closure issue, the value of u may have changed by the time the anonymous function mentioned in the defer is run. To address this, the simplest fix is to pass the url used in the loop as an argument to the function run in defer. --- server/embed/etcd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/embed/etcd.go b/server/embed/etcd.go index 0b896f9b5..c5b99a9ff 100644 --- a/server/embed/etcd.go +++ b/server/embed/etcd.go @@ -589,7 +589,7 @@ func configureClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err erro } } - defer func() { + defer func(u url.URL) { if err == nil { return } @@ -599,7 +599,7 @@ func configureClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err erro zap.String("address", u.Host), zap.Error(err), ) - }() + }(u) for k := range cfg.UserHandlers { sctx.userHandlers[k] = cfg.UserHandlers[k] }