From f809cd44eabbf3f0a263cb625b60adeb8f6802f0 Mon Sep 17 00:00:00 2001 From: Trond Abusdal Date: Mon, 9 Nov 2015 00:22:05 +0100 Subject: Fixed PacketPeerUDP getting wrongly closed due to recvfrom using rb.data_left instead of rb.space_left. --- drivers/unix/packet_peer_udp_posix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/unix/packet_peer_udp_posix.cpp') diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp index 94b4c35923..fd94f0e3bf 100644 --- a/drivers/unix/packet_peer_udp_posix.cpp +++ b/drivers/unix/packet_peer_udp_posix.cpp @@ -121,7 +121,7 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) { struct sockaddr_in from = {0}; socklen_t len = sizeof(struct sockaddr_in); int ret; - while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { + while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.space_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { rb.write((uint8_t*)&from.sin_addr, 4); uint32_t port = ntohs(from.sin_port); rb.write((uint8_t*)&port, 4); -- cgit v1.2.3 From 41a161647dd8f3f0bfa5727ee1b357ea8605c348 Mon Sep 17 00:00:00 2001 From: Trond Abusdal Date: Mon, 9 Nov 2015 01:33:16 +0100 Subject: * Winsock UDP messages sent to an unavailable target causing WSAECONNRESET will no longer close the socket. * Ensured that unsigned<->signed conversion would not cause wrong buffer size values sent to recvfrom. --- drivers/unix/packet_peer_udp_posix.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'drivers/unix/packet_peer_udp_posix.cpp') diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp index fd94f0e3bf..8e28dd5bca 100644 --- a/drivers/unix/packet_peer_udp_posix.cpp +++ b/drivers/unix/packet_peer_udp_posix.cpp @@ -120,8 +120,10 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) { struct sockaddr_in from = {0}; socklen_t len = sizeof(struct sockaddr_in); + int rb_size = MAX(rb.space_left()-12, 0); + int buffer_size = MIN((int)sizeof(recv_buffer),rb_size); int ret; - while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.space_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { + while ( (ret = recvfrom(sockfd, recv_buffer, buffer_size, p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { rb.write((uint8_t*)&from.sin_addr, 4); uint32_t port = ntohs(from.sin_port); rb.write((uint8_t*)&port, 4); @@ -131,6 +133,8 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) { ++queue_count; }; + + // TODO: Should ECONNRESET be handled here? if (ret == 0 || (ret == -1 && errno != EAGAIN) ) { close(); return FAILED; -- cgit v1.2.3 From a8a2458f0b490ee323632c95543106232efd8042 Mon Sep 17 00:00:00 2001 From: Trond Abusdal Date: Thu, 19 Nov 2015 19:06:01 +0100 Subject: Fixed mistake where available buffer size would not be updated for each recvfrom-call in PacketPeerUDPWinsockPposix. --- drivers/unix/packet_peer_udp_posix.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'drivers/unix/packet_peer_udp_posix.cpp') diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp index 8e28dd5bca..2111619080 100644 --- a/drivers/unix/packet_peer_udp_posix.cpp +++ b/drivers/unix/packet_peer_udp_posix.cpp @@ -120,10 +120,8 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) { struct sockaddr_in from = {0}; socklen_t len = sizeof(struct sockaddr_in); - int rb_size = MAX(rb.space_left()-12, 0); - int buffer_size = MIN((int)sizeof(recv_buffer),rb_size); int ret; - while ( (ret = recvfrom(sockfd, recv_buffer, buffer_size, p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { + while ( (ret = recvfrom(sockfd, recv_buffer, MIN((int)sizeof(recv_buffer),MAX(rb.space_left()-12, 0)), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { rb.write((uint8_t*)&from.sin_addr, 4); uint32_t port = ntohs(from.sin_port); rb.write((uint8_t*)&port, 4); -- cgit v1.2.3