go.net/netutil: LimitListener: avoid deadlock on multiple Close calls

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/12967043
diff --git a/netutil/listen.go b/netutil/listen.go
index 754703f..b23c6e9 100644
--- a/netutil/listen.go
+++ b/netutil/listen.go
@@ -6,7 +6,10 @@
 // common ones in the net package.
 package netutil
 
-import "net"
+import (
+	"net"
+	"sync"
+)
 
 // LimitListener returns a Listener that accepts at most n simultaneous
 // connections from the provided Listener.
@@ -29,16 +32,19 @@
 	if err != nil {
 		return nil, err
 	}
-	return &limitListenerConn{c, l.ch}, nil
+	return &limitListenerConn{Conn: c, ch: l.ch}, nil
 }
 
 type limitListenerConn struct {
 	net.Conn
-	ch chan<- struct{}
+	ch    chan<- struct{}
+	close sync.Once
 }
 
 func (l *limitListenerConn) Close() error {
 	err := l.Conn.Close()
-	l.ch <- struct{}{}
+	l.close.Do(func() {
+		l.ch <- struct{}{}
+	})
 	return err
 }