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);