From f5c37c8cbb20c2542c074c83473198401f0b3320 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Sat, 18 Nov 2017 13:34:20 +0100 Subject: [PATCH] Fix broken MSG_PEEK on TCP sockets (post-2.0.3 bug) MSG_PEEK on TCP sockets was broken since commit b71d4477eab7c19c34e57e5c9a1f8add63de7879 from 06.03.2017: recv hung in an endless loop and tcp_recved() was called for peeked data (which would result in a too large window advertised). Aded TCP MSG_PEEK to socket unit tests --- src/api/sockets.c | 4 ++-- test/unit/api/test_sockets.c | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index ccb33335..333c9539 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -926,9 +926,9 @@ lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) /* once we have some data to return, only add more if we don't need to wait */ apiflags |= NETCONN_DONTBLOCK; /* @todo: do we need to support peeking more than one pbuf? */ - } while ((recv_left > 0) || (flags & MSG_PEEK)); + } while ((recv_left > 0) && !(flags & MSG_PEEK)); lwip_recv_tcp_done: - if (recvd > 0) { + if ((recvd > 0) && !(flags & MSG_PEEK)) { /* ensure window update after copying all data */ netconn_tcp_recvd(sock->conn, (size_t)recvd); } diff --git a/test/unit/api/test_sockets.c b/test/unit/api/test_sockets.c index f665e8bb..44258a7e 100644 --- a/test/unit/api/test_sockets.c +++ b/test/unit/api/test_sockets.c @@ -161,6 +161,12 @@ static void test_sockets_allfunctions_basic_domain(int domain) while(tcpip_thread_poll_one()); + ret = lwip_recv(s2, buf, 3, MSG_PEEK); + fail_unless(ret == 3); + + ret = lwip_recv(s2, buf, 3, MSG_PEEK); + fail_unless(ret == 3); + ret = lwip_read(s2, buf, 4); fail_unless(ret == 4);