From 966511246dd03b9bf88fd6607e2449ea0cfd522a Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Mon, 9 May 2022 18:51:22 +0200 Subject: [PATCH] rpclient: fix masked error causing crash after max retries This commit fixes the error that is masked inside the for loop's scope. Previously after max retries the error didn't leave the for scope and therefore httpResponse remained nil which in turn resulted in a crash. --- rpcclient/infrastructure.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/rpcclient/infrastructure.go b/rpcclient/infrastructure.go index 22430a2e..93b036c0 100644 --- a/rpcclient/infrastructure.go +++ b/rpcclient/infrastructure.go @@ -776,8 +776,10 @@ func (c *Client) handleSendPostMessage(jReq *jsonRequest) { tries := 10 for i := 0; i < tries; i++ { + var httpReq *http.Request + bodyReader := bytes.NewReader(jReq.marshalledJSON) - httpReq, err := http.NewRequest("POST", url, bodyReader) + httpReq, err = http.NewRequest("POST", url, bodyReader) if err != nil { jReq.responseChan <- &Response{result: nil, err: err} return @@ -815,6 +817,15 @@ func (c *Client) handleSendPostMessage(jReq *jsonRequest) { return } + // We still want to return an error if for any reason the respone + // remains empty. + if httpResponse == nil { + jReq.responseChan <- &Response{ + err: fmt.Errorf("invalid http POST response (nil), "+ + "method: %s, id: %d", jReq.method, jReq.id), + } + } + // Read the raw bytes and close the response. respBytes, err := ioutil.ReadAll(httpResponse.Body) httpResponse.Body.Close()