From 69d25e845f5fca6ee2446dfe5bbbabc22549f062 Mon Sep 17 00:00:00 2001 From: Tom Thorogood Date: Wed, 10 Jan 2018 00:27:26 +1030 Subject: [PATCH] Fixes #613 & #619 (#621) * Do not reutrn ErrShortRead in readUDP A read of zero bytes indicates a peer shutdown for TCP sockets -- and thus returning ErrShortRead is fine in readTCP -- but not for UDP sockets. For UDP sockets a read of zero bytes literally indicates a zero-byte datagram, and is a valid return value not indicating an error. Removing this case will cause readUDP to correctly return a zero-byte message. * Return non-temporary error from serveUDP loop Fixes #613 --- server.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server.go b/server.go index 136a9a1c..ebe46e4d 100644 --- a/server.go +++ b/server.go @@ -509,7 +509,10 @@ func (srv *Server) serveUDP(l *net.UDPConn) error { } srv.lock.RUnlock() if err != nil { - continue + if netErr, ok := err.(net.Error); ok && netErr.Temporary() { + continue + } + return err } go srv.serve(s.RemoteAddr(), handler, m, l, s, nil) } @@ -626,11 +629,8 @@ func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *S conn.SetReadDeadline(time.Now().Add(timeout)) m := make([]byte, srv.UDPSize) n, s, err := ReadFromSessionUDP(conn, m) - if err != nil || n == 0 { - if err != nil { - return nil, nil, err - } - return nil, nil, ErrShortRead + if err != nil { + return nil, nil, err } m = m[:n] return m, s, nil