From 0a92e50b2704c1eb02233c9aa5778d21455d345b Mon Sep 17 00:00:00 2001 From: Jeff Halter <868228+jhalter@users.noreply.github.com> Date: Sun, 5 Jun 2022 15:27:54 -0700 Subject: Fix some data races --- hotline/server.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'hotline/server.go') diff --git a/hotline/server.go b/hotline/server.go index 5ff8842..cf022fc 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -646,28 +646,42 @@ const dlFldrActionNextFile = 3 // handleFileTransfer receives a client net.Conn from the file transfer server, performs the requested transfer type, then closes the connection func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error { defer func() { + if err := conn.Close(); err != nil { s.Logger.Errorw("error closing connection", "error", err) } }() + defer func() { + if r := recover(); r != nil { + fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) + s.Logger.Errorw("PANIC", "err", r, "trace", string(debug.Stack())) + } + }() + txBuf := make([]byte, 16) - _, err := conn.Read(txBuf) - if err != nil { + if _, err := io.ReadFull(conn, txBuf); err != nil { return err } var t transfer - _, err = t.Write(txBuf) - if err != nil { + if _, err := t.Write(txBuf); err != nil { return err } transferRefNum := binary.BigEndian.Uint32(t.ReferenceNumber[:]) - fileTransfer := s.FileTransfers[transferRefNum] + defer func() { + s.mux.Lock() + delete(s.FileTransfers, transferRefNum) + s.mux.Unlock() + }() - // delete single use transferRefNum - delete(s.FileTransfers, transferRefNum) + s.mux.Lock() + fileTransfer, ok := s.FileTransfers[transferRefNum] + s.mux.Unlock() + if !ok { + return errors.New("invalid transaction ID") + } switch fileTransfer.Type { case FileDownload: -- cgit