From a10910f3981908424493c043d26dfcb4e5f8dc25 Mon Sep 17 00:00:00 2001 From: Steven Angles Date: Mon, 16 Aug 2021 17:04:47 -0400 Subject: admin: Sync server variables (fix #4260) (#4274) * Synchronize server assignment/references to avoid data race * only hold lock during var reassignment --- admin.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'admin.go') diff --git a/admin.go b/admin.go index ff5bc71..fb45168 100644 --- a/admin.go +++ b/admin.go @@ -335,6 +335,7 @@ func replaceLocalAdminServer(cfg *Config) error { return err } + serverMu.Lock() localAdminServer = &http.Server{ Addr: addr.String(), // for logging purposes only Handler: handler, @@ -343,10 +344,14 @@ func replaceLocalAdminServer(cfg *Config) error { IdleTimeout: 60 * time.Second, MaxHeaderBytes: 1024 * 64, } + serverMu.Unlock() adminLogger := Log().Named("admin") go func() { - if err := localAdminServer.Serve(ln); !errors.Is(err, http.ErrServerClosed) { + serverMu.Lock() + server := localAdminServer + serverMu.Unlock() + if err := server.Serve(ln); !errors.Is(err, http.ErrServerClosed) { adminLogger.Error("admin server shutdown for unknown reason", zap.Error(err)) } }() @@ -474,6 +479,7 @@ func replaceRemoteAdminServer(ctx Context, cfg *Config) error { return err } + serverMu.Lock() // create secure HTTP server remoteAdminServer = &http.Server{ Addr: addr.String(), // for logging purposes only @@ -485,6 +491,7 @@ func replaceRemoteAdminServer(ctx Context, cfg *Config) error { MaxHeaderBytes: 1024 * 64, ErrorLog: serverLogger, } + serverMu.Unlock() // start listener ln, err := Listen(addr.Network, addr.JoinHostPort(0)) @@ -494,7 +501,10 @@ func replaceRemoteAdminServer(ctx Context, cfg *Config) error { ln = tls.NewListener(ln, tlsConfig) go func() { - if err := remoteAdminServer.Serve(ln); !errors.Is(err, http.ErrServerClosed) { + serverMu.Lock() + server := remoteAdminServer + serverMu.Unlock() + if err := server.Serve(ln); !errors.Is(err, http.ErrServerClosed) { remoteLogger.Error("admin remote server shutdown for unknown reason", zap.Error(err)) } }() @@ -1229,6 +1239,7 @@ var bufPool = sync.Pool{ // keep a reference to admin endpoint singletons while they're active var ( + serverMu sync.Mutex localAdminServer, remoteAdminServer *http.Server identityCertCache *certmagic.Cache ) -- cgit v1.2.3