From 79425a687901793d241744ff23765b514c6a2047 Mon Sep 17 00:00:00 2001 From: Zach Nofz Date: Sun, 5 May 2019 15:06:30 -0700 Subject: [PATCH 1/2] Fixed infinite loop when socket readline fails In certain cases, the socket may not receive a full response (or any response), causing the while loop in readline to go on forever. After failing to receive any data, this fix will raise an exception and fail out. --- adafruit_esp32spi/adafruit_esp32spi_socket.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/adafruit_esp32spi/adafruit_esp32spi_socket.py b/adafruit_esp32spi/adafruit_esp32spi_socket.py index aec0f6d..4b5dcec 100644 --- a/adafruit_esp32spi/adafruit_esp32spi_socket.py +++ b/adafruit_esp32spi/adafruit_esp32spi_socket.py @@ -85,11 +85,15 @@ def write(self, data): # pylint: disable=no-self-use def readline(self): """Attempt to return as many bytes as we can up to but not including '\r\n'""" #print("Socket readline") + stamp = time.monotonic() while b'\r\n' not in self._buffer: # there's no line already in there, read some more avail = min(_the_interface.socket_available(self._socknum), MAX_PACKET) if avail: self._buffer += _the_interface.socket_read(self._socknum, avail) + elif time.monotonic() - stamp > self._timeout: + self.close() # Make sure to close socket so that we don't exhaust sockets. + raise RuntimeError("Didn't receive full response, failing out") firstline, self._buffer = self._buffer.split(b'\r\n', 1) gc.collect() return firstline From bf54a08358cbea90cb78975f21b601aee9398123 Mon Sep 17 00:00:00 2001 From: Zachary N Date: Sat, 18 May 2019 22:43:18 -0700 Subject: [PATCH 2/2] Update adafruit_esp32spi/adafruit_esp32spi_socket.py Co-Authored-By: Craig --- adafruit_esp32spi/adafruit_esp32spi_socket.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi_socket.py b/adafruit_esp32spi/adafruit_esp32spi_socket.py index 4b5dcec..6c09d6a 100644 --- a/adafruit_esp32spi/adafruit_esp32spi_socket.py +++ b/adafruit_esp32spi/adafruit_esp32spi_socket.py @@ -91,7 +91,7 @@ def readline(self): avail = min(_the_interface.socket_available(self._socknum), MAX_PACKET) if avail: self._buffer += _the_interface.socket_read(self._socknum, avail) - elif time.monotonic() - stamp > self._timeout: + elif self._timeout > 0 and time.monotonic() - stamp > self._timeout: self.close() # Make sure to close socket so that we don't exhaust sockets. raise RuntimeError("Didn't receive full response, failing out") firstline, self._buffer = self._buffer.split(b'\r\n', 1)