mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-14 07:26:47 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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'")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user