hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 355736ec357c81dfb2eb6851ee019d407090c5ec
parent 93a447c5dd053e1c934036a66ebd05b95250a1d1
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Sun, 30 Apr 2017 01:10:03 +0200

livereload: Fix data race in close

Fixes #2625

Diffstat:
Mlivereload/connection.go | 11+++++++++++
Mlivereload/hub.go | 4++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/livereload/connection.go b/livereload/connection.go
@@ -15,6 +15,7 @@ package livereload
 
 import (
 	"bytes"
+	"sync"
 
 	"github.com/gorilla/websocket"
 )
@@ -25,6 +26,16 @@ type connection struct {
 
 	// Buffered channel of outbound messages.
 	send chan []byte
+
+	// There is a potential data race, especially visible with large files.
+	// This is protected by synchronisation of the send channel's close.
+	closer sync.Once
+}
+
+func (c *connection) close() {
+	c.closer.Do(func() {
+		close(c.send)
+	})
 }
 
 func (c *connection) reader() {
diff --git a/livereload/hub.go b/livereload/hub.go
@@ -41,14 +41,14 @@ func (h *hub) run() {
 			h.connections[c] = true
 		case c := <-h.unregister:
 			delete(h.connections, c)
-			close(c.send)
+			c.close()
 		case m := <-h.broadcast:
 			for c := range h.connections {
 				select {
 				case c.send <- m:
 				default:
 					delete(h.connections, c)
-					close(c.send)
+					c.close()
 				}
 			}
 		}