Commit fd926ed4 authored by Jan Moskyto Matejka's avatar Jan Moskyto Matejka
Browse files

Poll: Prevent the improbable case of EAGAIN after POLLIN

parent e1c13a5a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -576,7 +576,7 @@ sockets_close_fds(struct birdloop *loop)
  loop->close_scheduled = 0;
}

int sk_read(sock *s);
int sk_read(sock *s, int revents);
int sk_write(sock *s);

static void
@@ -605,7 +605,7 @@ sockets_fire(struct birdloop *loop)

    if (pfd->revents & POLLIN)
      while (e && *psk && (*psk)->rx_hook)
	e = sk_read(*psk);
	e = sk_read(*psk, 0);

    e = 1;
    if (pfd->revents & POLLOUT)
+8 −3
Original line number Diff line number Diff line
@@ -1760,7 +1760,7 @@ sk_send_full(sock *s, unsigned len, struct iface *ifa,
 /* sk_read() and sk_write() are called from BFD's event loop */

int
sk_read(sock *s)
sk_read(sock *s, int revents)
{
  switch (s->type)
  {
@@ -1779,6 +1779,11 @@ sk_read(sock *s)
      {
	if (errno != EINTR && errno != EAGAIN)
	  s->err_hook(s, errno);
	else if (errno == EAGAIN && !(revents & POLLIN))
	{
	  log(L_ERR "Got EAGAIN from read when revents=%x (without POLLIN)", revents);
	  s->err_hook(s, 0);
	}
      }
      else if (!c)
	s->err_hook(s, 0);
@@ -2159,7 +2164,7 @@ io_loop(void)
		  {
		    steps--;
		    io_log_event(s->rx_hook, s->data);
		    e = sk_read(s);
		    e = sk_read(s, pfd[s->index].revents);
		    if (s != current_sock)
		      goto next;
		  }
@@ -2203,7 +2208,7 @@ io_loop(void)
		{
		  count++;
		  io_log_event(s->rx_hook, s->data);
		  sk_read(s);
		  sk_read(s, pfd[s->index].revents);
		  if (s != current_sock)
		      goto next2;
		}