mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-06-05 15:10:59 +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
|
// parseBinaryResponse parses a websocket binary response into a usable byte array
|
||||||
func (w *WebsocketConnection) parseBinaryResponse(resp []byte) ([]byte, error) {
|
func (w *WebsocketConnection) parseBinaryResponse(resp []byte) ([]byte, error) {
|
||||||
var standardMessage []byte
|
var reader io.ReadCloser
|
||||||
var err error
|
var err error
|
||||||
// Detect GZIP
|
if len(resp) >= 2 && resp[0] == 31 && resp[1] == 139 { // Detect GZIP
|
||||||
if resp[0] == 31 && resp[1] == 139 {
|
reader, err = gzip.NewReader(bytes.NewReader(resp))
|
||||||
b := bytes.NewReader(resp)
|
|
||||||
var gReader *gzip.Reader
|
|
||||||
gReader, err = gzip.NewReader(b)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return standardMessage, err
|
return nil, err
|
||||||
}
|
|
||||||
standardMessage, err = io.ReadAll(gReader)
|
|
||||||
if err != nil {
|
|
||||||
return standardMessage, err
|
|
||||||
}
|
|
||||||
err = gReader.Close()
|
|
||||||
if err != nil {
|
|
||||||
return standardMessage, err
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reader := flate.NewReader(bytes.NewReader(resp))
|
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return standardMessage, nil
|
standardMessage, err := io.ReadAll(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return standardMessage, reader.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateMessageID Creates a messageID to checkout
|
// GenerateMessageID Creates a messageID to checkout
|
||||||
|
|||||||
@@ -908,7 +908,12 @@ func TestParseBinaryResponse(t *testing.T) {
|
|||||||
t.Error(err3)
|
t.Error(err3)
|
||||||
}
|
}
|
||||||
if !strings.EqualFold(string(resp2), "hello") {
|
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