From 0744019555acd46783b910991816262277957acc Mon Sep 17 00:00:00 2001 From: Kane York Date: Mon, 18 Sep 2017 14:54:09 -0700 Subject: [PATCH] Handle errors in UnmarshalClientMessage --- socketserver/server/handlecore.go | 35 ++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/socketserver/server/handlecore.go b/socketserver/server/handlecore.go index 1328a523..ea4847ef 100644 --- a/socketserver/server/handlecore.go +++ b/socketserver/server/handlecore.go @@ -249,11 +249,21 @@ func HTTPHandleRootURL(w http.ResponseWriter, r *http.Request) { } } +type fatalDecodeError string + +func (e fatalDecodeError) Error() string { + return string(e) +} + +func (e fatalDecodeError) IsFatal() bool { + return true +} + // ErrProtocolGeneric is sent in a ErrorCommand Reply. -var ErrProtocolGeneric error = errors.New("FFZ Socket protocol error.") +var ErrProtocolGeneric error = fatalDecodeError("FFZ Socket protocol error.") // ErrProtocolNegativeMsgID is sent in a ErrorCommand Reply when a negative MessageID is received. -var ErrProtocolNegativeMsgID error = errors.New("FFZ Socket protocol error: negative or zero message ID.") +var ErrProtocolNegativeMsgID error = fatalDecodeError("FFZ Socket protocol error: negative or zero message ID.") // ErrExpectedSingleString is sent in a ErrorCommand Reply when the Arguments are of the wrong type. var ErrExpectedSingleString = errors.New("Error: Expected single string as arguments.") @@ -344,7 +354,7 @@ func RunSocketConnection(conn *websocket.Conn) { }) // All set up, now enter the work loop - go runSocketReader(conn, _errorChan, _clientChan, stoppedChan) + go runSocketReader(conn, &client, _errorChan, _clientChan) closeReason := runSocketWriter(conn, &client, _errorChan, _clientChan, _serverMessageChan) // Exit @@ -376,12 +386,14 @@ func RunSocketConnection(conn *websocket.Conn) { } } -func runSocketReader(conn *websocket.Conn, errorChan chan<- error, clientChan chan<- ClientMessage, stoppedChan <-chan struct{}) { +func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<- error, clientChan chan<- ClientMessage) { var msg ClientMessage var messageType int var packet []byte var err error + stoppedChan := client.MsgChannelIsDone + defer close(errorChan) defer close(clientChan) @@ -395,8 +407,15 @@ func runSocketReader(conn *websocket.Conn, errorChan chan<- error, clientChan ch break } - UnmarshalClientMessage(packet, messageType, &msg) - if msg.MessageID == 0 { + msg = ClientMessage{} + msgErr := UnmarshalClientMessage(packet, messageType, &msg) + if _, ok := msgErr.(interface{IsFatal() bool}); ok { + errorChan <- msgErr + continue + } else if msgErr != nil { + client.Send(msg.Reply(ErrorCommand, msgErr.Error())) + continue + } else if msg.MessageID == 0 { continue } select { @@ -514,11 +533,11 @@ func UnmarshalClientMessage(data []byte, _ int, v interface{}) (err error) { // Message ID spaceIdx = strings.IndexRune(dataStr, ' ') if spaceIdx == -1 { - return ErrProtocolGeneric + return ErrProtocolGeneric // fatal error } messageID, err := strconv.Atoi(dataStr[:spaceIdx]) if messageID < -1 || messageID == 0 { - return ErrProtocolNegativeMsgID + return ErrProtocolNegativeMsgID // fatal error } out.MessageID = messageID