From af88a4d9fe164fafd1c96c532ece427b0e6164fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Fri, 13 Oct 2023 16:00:37 +0300 Subject: [PATCH] Fix client fails on large responses --- manticore/client.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/manticore/client.go b/manticore/client.go index bf9f3e6..315579e 100644 --- a/manticore/client.go +++ b/manticore/client.go @@ -135,6 +135,34 @@ func (cl *Client) connect() error { return cl.failclose(err) } +/// read raw answer (with fixed size) to buf +func (cl *Client) readRawAnswer(buf []byte, size int) (int, error) { + const MAX_CHUNK_SIZE = 16 * 1024 + nbytes := 0 + for { + chunkSize := MAX_CHUNK_SIZE + bytesRemaining := size - nbytes + if bytesRemaining < chunkSize { + chunkSize = bytesRemaining + } + n, e := cl.conn.Read(buf[nbytes:nbytes+chunkSize]) + if e != nil { + return n, e + } + nbytes += n + if (nbytes < size) { + continue + } + break + } + + if (nbytes > size) { + return nbytes, errors.New("Logical error in Client.read()!") + } + + return nbytes, nil +} + /// get and check response packet from searchd server func (cl *Client) getResponse(client_ver uCommandVersion) (apibuf, error) { rawrecv := cl.getByteBuf(8) @@ -151,7 +179,7 @@ func (cl *Client) getResponse(client_ver uCommandVersion) (apibuf, error) { iReplySize := rawrecv.getInt() rawanswer := cl.getByteBuf(iReplySize) - nbytes, err = cl.conn.Read(*rawanswer) + nbytes, err = cl.readRawAnswer(*rawanswer, iReplySize) if err != nil { return nil, err }