From 47de9c3564c93890b9fbbbfec0a2e6b53ca2dcd5 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Tue, 12 Jul 2016 16:15:25 -0700 Subject: [PATCH] server: close only non-closed listeners The listener can be closed twice: in Close and in Serve. It might lead to pretty bad things, for example, https://golang.org/src/net/unixsock_posix.go#L340 can delete a file which created by another listener. Signed-off-by: Alexander Morozov --- server.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server.go b/server.go index f7b8319b4..6104c55d1 100644 --- a/server.go +++ b/server.go @@ -320,9 +320,11 @@ func (s *Server) Serve(lis net.Listener) error { s.lis[lis] = true s.mu.Unlock() defer func() { - lis.Close() s.mu.Lock() - delete(s.lis, lis) + if s.lis != nil && s.lis[lis] { + lis.Close() + delete(s.lis, lis) + } s.mu.Unlock() }() for {