From 6d2e9e70b33a2e545bcb888d80117385fcd24ae5 Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 30 Dec 2015 19:03:58 +0000 Subject: [PATCH] extmod/modlwip: Check for state change during recv busy-wait loop. For example, the peer may close the connection while recv is waiting for incoming data. --- extmod/modlwip.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extmod/modlwip.c b/extmod/modlwip.c index 1f93cde836..05b6208f2a 100644 --- a/extmod/modlwip.c +++ b/extmod/modlwip.c @@ -391,13 +391,19 @@ STATIC mp_uint_t lwip_tcp_receive(lwip_socket_obj_t *socket, byte *buf, mp_uint_ if (socket->incoming.pbuf == NULL) { mp_uint_t start = mp_hal_ticks_ms(); - while (socket->incoming.pbuf == NULL) { + while (socket->state == STATE_CONNECTED && socket->incoming.pbuf == NULL) { if (socket->timeout != -1 && mp_hal_ticks_ms() - start > socket->timeout) { *_errno = ETIMEDOUT; return -1; } poll_sockets(); } + if (socket->state == STATE_PEER_CLOSED) { + return 0; + } else if (socket->state != STATE_CONNECTED) { + *_errno = -socket->state; + return -1; + } } struct pbuf *p = socket->incoming.pbuf;