Ver Fonte

Fix data races

Philipp Heckel há 4 anos atrás
pai
commit
802ef17cb4
2 ficheiros alterados com 8 adições e 1 exclusões
  1. 3 0
      server/server.go
  2. 5 1
      util/util.go

+ 3 - 0
server/server.go

@@ -386,8 +386,11 @@ func (s *Server) handleSubscribe(w http.ResponseWriter, r *http.Request, v *visi
 	if err != nil {
 		return err
 	}
+	var wlock sync.Mutex
 	poll := r.URL.Query().Has("poll")
 	sub := func(msg *message) error {
+		wlock.Lock()
+		defer wlock.Unlock()
 		m, err := encoder(msg)
 		if err != nil {
 			return err

+ 5 - 1
util/util.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"math/rand"
 	"os"
+	"sync"
 	"time"
 )
 
@@ -12,7 +13,8 @@ const (
 )
 
 var (
-	random = rand.New(rand.NewSource(time.Now().UnixNano()))
+	random      = rand.New(rand.NewSource(time.Now().UnixNano()))
+	randomMutex = sync.Mutex{}
 )
 
 // FileExists checks if a file exists, and returns true if it does
@@ -23,6 +25,8 @@ func FileExists(filename string) bool {
 
 // RandomString returns a random string with a given length
 func RandomString(length int) string {
+	randomMutex.Lock() // Who would have thought that random.Intn() is not thread-safe?!
+	defer randomMutex.Unlock()
 	b := make([]byte, length)
 	for i := range b {
 		b[i] = randomStringCharset[random.Intn(len(randomStringCharset))]