]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/server.go
Fix mutex lock bug on invalid client
[rbdr/mobius] / hotline / server.go
index 164b93ec1fa5045afae838fe939b80ffda35c331..e28ff9a597dc93ef7f8a6d06d0430290150dd14d 100644 (file)
@@ -152,13 +152,12 @@ func (s *Server) sendTransaction(t Transaction) error {
        }
 
        s.mux.Lock()
+       defer s.mux.Unlock()
        client := s.Clients[uint16(clientID)]
        if client == nil {
                return fmt.Errorf("invalid client id %v", *t.clientID)
        }
 
-       s.mux.Unlock()
-
        b, err := t.MarshalBinary()
        if err != nil {
                return err
@@ -565,8 +564,13 @@ func (s *Server) handleNewConnection(ctx context.Context, rwc io.ReadWriteCloser
 
        scanner.Scan()
 
+       // Make a new []byte slice and copy the scanner bytes to it.  This is critical to avoid a data race as the
+       // scanner re-uses the buffer for subsequent scans.
+       buf := make([]byte, len(scanner.Bytes()))
+       copy(buf, scanner.Bytes())
+
        var clientLogin Transaction
-       if _, err := clientLogin.Write(scanner.Bytes()); err != nil {
+       if _, err := clientLogin.Write(buf); err != nil {
                return err
        }