aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2016-11-10 16:43:15 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2016-11-10 18:30:49 +0000
commit8cd55615d4d00f48c30dff85d5d5e3f2adce70ce (patch)
tree30372104e50dc600de59d35d55cfeb97feadfda4
parent8d0c105407d235c85a163c0cda5bda86e5219c36 (diff)
downloadgo-8cd55615d4d00f48c30dff85d5d5e3f2adce70ce.tar.gz
go-8cd55615d4d00f48c30dff85d5d5e3f2adce70ce.zip
net/http: fix Server.Close double Lock
Fixes #17878 Change-Id: I062ac514239068c58175c9ee7964b3590f956a82 Reviewed-on: https://go-review.googlesource.com/33026 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/net/http/serve_test.go7
-rw-r--r--src/net/http/server.go2
2 files changed, 8 insertions, 1 deletions
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go
index 08b9862e16..6fd9912b5e 100644
--- a/src/net/http/serve_test.go
+++ b/src/net/http/serve_test.go
@@ -4988,3 +4988,10 @@ func testServerShutdown(t *testing.T, h2 bool) {
t.Fatal("second request should fail. server should be shut down")
}
}
+
+// Issue 17878: tests that we can call Close twice.
+func TestServerCloseDeadlock(t *testing.T) {
+ var s Server
+ s.Close()
+ s.Close()
+}
diff --git a/src/net/http/server.go b/src/net/http/server.go
index 0959ac6f85..d78fd71a8d 100644
--- a/src/net/http/server.go
+++ b/src/net/http/server.go
@@ -2362,7 +2362,7 @@ func (s *Server) closeDoneChanLocked() {
// regardless of their state. For a graceful shutdown, use Shutdown.
func (s *Server) Close() error {
s.mu.Lock()
- defer s.mu.Lock()
+ defer s.mu.Unlock()
s.closeDoneChanLocked()
err := s.closeListenersLocked()
for c := range s.activeConn {