websocket: Check for slice size to avoid panic when classifying empty binary message (#1219)

* Check for slice size to avoid panic when classifying empty resp

* Simplify according to suggestion
This commit is contained in:
TaltaM
2023-06-09 01:24:33 +02:00
committed by GitHub
parent bb449c2085
commit a024ad53ae
2 changed files with 16 additions and 26 deletions

View File

@@ -268,36 +268,21 @@ func (w *WebsocketConnection) ReadMessage() Response {
// parseBinaryResponse parses a websocket binary response into a usable byte array
func (w *WebsocketConnection) parseBinaryResponse(resp []byte) ([]byte, error) {
var standardMessage []byte
var reader io.ReadCloser
var err error
// Detect GZIP
if resp[0] == 31 && resp[1] == 139 {
b := bytes.NewReader(resp)
var gReader *gzip.Reader
gReader, err = gzip.NewReader(b)
if len(resp) >= 2 && resp[0] == 31 && resp[1] == 139 { // Detect GZIP
reader, err = gzip.NewReader(bytes.NewReader(resp))
if err != nil {
return standardMessage, err
}
standardMessage, err = io.ReadAll(gReader)
if err != nil {
return standardMessage, err
}
err = gReader.Close()
if err != nil {
return standardMessage, err
return nil, err
}
} else {
reader := flate.NewReader(bytes.NewReader(resp))
standardMessage, err = io.ReadAll(reader)
if err != nil {
return standardMessage, err
}
err = reader.Close()
if err != nil {
return standardMessage, err
}
reader = flate.NewReader(bytes.NewReader(resp))
}
return standardMessage, nil
standardMessage, err := io.ReadAll(reader)
if err != nil {
return nil, err
}
return standardMessage, reader.Close()
}
// GenerateMessageID Creates a messageID to checkout

View File

@@ -908,7 +908,12 @@ func TestParseBinaryResponse(t *testing.T) {
t.Error(err3)
}
if !strings.EqualFold(string(resp2), "hello") {
t.Errorf("GZip conversion failed. Received: '%v', Expected: 'hello'", string(resp2))
t.Errorf("Deflate conversion failed. Received: '%v', Expected: 'hello'", string(resp2))
}
_, err4 := wc.parseBinaryResponse([]byte{})
if err4 == nil || err4.Error() != "unexpected EOF" {
t.Error("Expected error 'unexpected EOF'")
}
}