Don't set the POLLIN flag on a socket if the socket buffer is
full. I.e. a socket with full read buffer is not included in the io
loop for reading.

Signed-off-by: Kenth Eriksson <kenth.eriks...@infinera.com>
---
 sysdep/unix/io.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c
index d1d86e3b..2b163417 100644
--- a/sysdep/unix/io.c
+++ b/sysdep/unix/io.c
@@ -1845,6 +1845,12 @@ sk_read_ssh(sock *s)
 }
 #endif
 
+static inline size_t
+sk_rbcount(sock *s)
+{
+  return s->rbuf + s->rbsize - s->rpos;
+}
+
  /* sk_read() and sk_write() are called from BFD's event loop */
 
 int
@@ -1861,7 +1867,7 @@ sk_read(sock *s, int revents)
   case SK_TCP:
   case SK_UNIX:
     {
-      int c = read(s->fd, s->rpos, s->rbuf + s->rbsize - s->rpos);
+      int c = read(s->fd, s->rpos, sk_rbcount(s));
 
       if (c < 0)
       {
@@ -2207,7 +2213,7 @@ io_loop(void)
        {
          pfd[nfds] = (struct pollfd) { .fd = -1 }; /* everything other set to 
0 by this */
          s = SKIP_BACK(sock, n, n);
-         if (s->rx_hook)
+         if (s->rx_hook && sk_rbcount(s))
            {
              pfd[nfds].fd = s->fd;
              pfd[nfds].events |= POLLIN;
-- 
2.21.0

Reply via email to