commit 6e36f49c5f08cc96b4c8469e245c28c3b58c23bb
Author: Taylor R Campbell <[email protected]>
Date:   Wed Jun 17 17:39:02 2015 +0000

    Block, rather than busy-wait, in send/recv_data_impl.
---
 src/common/socks5.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/common/socks5.c b/src/common/socks5.c
index 3f284ca..f56d69c 100644
--- a/src/common/socks5.c
+++ b/src/common/socks5.c
@@ -49,9 +49,13 @@ static ssize_t recv_data_impl(int fd, void *buf, size_t len)
                                /* Try again after interruption. */
                                continue;
                        } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
-                               if (index) {
-                                       /* Return the number of bytes received 
up to this point. */
-                                       ret = index;
+                               /* Wait for data to become available */
+                               fd_set readfds;
+                               FD_ZERO(&readfds);
+                               FD_SET(fd, &readfds);
+                               if (select(fd + 1, &readfds, NULL, NULL, NULL) 
< 0) {
+                                       ret = -errno;
+                                       goto error;
                                }
                                continue;
                        } else if (read_len == 0) {
@@ -102,9 +106,13 @@ static ssize_t send_data_impl(int fd, const void *buf, 
size_t len)
                                /* Send again after interruption. */
                                continue;
                        } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
-                               if (index) {
-                                       /* Return the number of bytes sent up 
to this point. */
-                                       ret = index;
+                               /* Wait for buffer space to become available */
+                               fd_set writefds;
+                               FD_ZERO(&writefds);
+                               FD_SET(fd, &writefds);
+                               if (select(fd + 1, NULL, &writefds, NULL, NULL) 
< 0) {
+                                       ret = -errno;
+                                       goto error;
                                }
                                continue;
                        } else {



_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to