From b500bcd436ded093bf58ed2fc03f6b090c012568 Mon Sep 17 00:00:00 2001 From: better0fdead Date: Tue, 5 Dec 2023 14:30:19 +0300 Subject: [PATCH] connection: fix svacer issue Changed type of 'length' variable in 'read' function to avoid overflow when calculating it. (cherry picked from 7d73f6a) --- connection.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/connection.go b/connection.go index 055941e78..60cad18d5 100644 --- a/connection.go +++ b/connection.go @@ -1190,7 +1190,7 @@ func (conn *Connection) timeouts() { } func read(r io.Reader, lenbuf []byte) (response []byte, err error) { - var length int + var length uint64 if _, err = io.ReadFull(r, lenbuf); err != nil { return @@ -1199,15 +1199,20 @@ func read(r io.Reader, lenbuf []byte) (response []byte, err error) { err = errors.New("Wrong response header") return } - length = (int(lenbuf[1]) << 24) + - (int(lenbuf[2]) << 16) + - (int(lenbuf[3]) << 8) + - int(lenbuf[4]) + length = (uint64(lenbuf[1]) << 24) + + (uint64(lenbuf[2]) << 16) + + (uint64(lenbuf[3]) << 8) + + uint64(lenbuf[4]) - if length == 0 { - err = errors.New("Response should not be 0 length") + switch { + case length == 0: + err = errors.New("response should not be 0 length") + return + case length > math.MaxUint32: + err = errors.New("response is too big") return } + response = make([]byte, length) _, err = io.ReadFull(r, response)