From 998ed992888ddab14744b1d6f8d30fd69d4b6447 Mon Sep 17 00:00:00 2001 From: sg Date: Wed, 18 Feb 2015 20:38:42 +0100 Subject: [PATCH] Fixed select not reporting received FIN as 'readable' in certain rare cases (bug #43779: select(), close(), and TCP retransmission error) --- CHANGELOG | 8 ++++---- src/api/sockets.c | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 06a3cbdf..1bd470f1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,10 +6,6 @@ HISTORY ++ New features: - 2015-02-17: Sylvain Rochet - * Large PPP rework, moved out low level protocols code (PPPoS, PPPoE, PPPoL2TP) - from PPP core code, making everything simpler. - 2015-02-16: Claudius Zingerli, Sergio Caprile * opt.h, dhcp.h/.c: patch #8361 "Add support for NTP option in DHCP" @@ -190,6 +186,10 @@ HISTORY ++ Bugfixes: + 2015-02-18: Simon Goldschmidt + * sockets.c: Fixed select not reporting received FIN as 'readable' in certain + rare cases (bug #43779: select(), close(), and TCP retransmission error) + 2015-02-17: Simon Goldschmidt * err.h, sockets.c, api_msg.c: fixed bug #38853 "connect() use a wrong errno": return ERR_ALREADY/EALRADY during connect, ERR_ISCONN/EISCONN when already diff --git a/src/api/sockets.c b/src/api/sockets.c index 6dfe57eb..d298096f 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -730,6 +730,10 @@ lwip_recvfrom(int s, void *mem, size_t len, int flags, if (off > 0) { /* update receive window */ netconn_recved(sock->conn, (u32_t)off); + if (err == ERR_CLSD) { + /* closed but already received data, ensure select gets the FIN, too */ + event_callback(sock->conn, NETCONN_EVT_RCVPLUS, 0); + } /* already received data, return that */ sock_set_errno(sock, 0); return off;