tap: Re-read from tap in tap_handler_pasta() on buffer full

read() will return zero if we pass a zero length, which makes no
sense: instead, track explicitly that we exhausted the buffer, flush
packets to handlers and redo.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2022-03-30 05:45:23 +02:00
parent 8d85b6a99e
commit 8fd20ad99d

11
tap.c
View file

@ -713,9 +713,12 @@ next:
*/
static int tap_handler_pasta(struct ctx *c, const struct timespec *now)
{
ssize_t n = 0, len;
ssize_t n, len;
int ret;
redo:
n = 0;
pool_flush(pool_tap4);
pool_flush(pool_tap6);
restart:
@ -746,7 +749,8 @@ restart:
break;
}
n += len;
if ((n += len) == TAP_BUF_BYTES)
break;
}
if (len < 0 && errno == EINTR)
@ -760,6 +764,9 @@ restart:
if (len > 0 || ret == EAGAIN)
return 0;
if (n == TAP_BUF_BYTES)
goto redo;
epoll_ctl(c->epollfd, EPOLL_CTL_DEL, c->fd_tap, NULL);
close(c->fd_tap);