tap: Don't risk truncating frames on full buffer in tap_pasta_input()

tap_pasta_input() keeps reading frames from the tap device until the
buffer is full.  However, this has an ugly edge case, when we get close
to buffer full, we will provide just the remaining space as a read()
buffer.  If this is shorter than the next frame to read, the tap device
will truncate the frame and discard the remainder.

Adjust the code to make sure we always have room for a maximum size frame.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2024-09-06 21:49:39 +10:00 committed by Stefano Brivio
parent d2a1dc744b
commit a33ecafbd9

4
tap.c
View file

@ -1076,8 +1076,8 @@ static void tap_pasta_input(struct ctx *c, const struct timespec *now)
tap_flush_pools(); tap_flush_pools();
for (n = 0; n < (ssize_t)TAP_BUF_BYTES; n += len) { for (n = 0; n <= (ssize_t)TAP_BUF_BYTES - ETH_MAX_MTU; n += len) {
len = read(c->fd_tap, pkt_buf + n, TAP_BUF_BYTES - n); len = read(c->fd_tap, pkt_buf + n, ETH_MAX_MTU);
if (len == 0) { if (len == 0) {
die("EOF on tap device, exiting"); die("EOF on tap device, exiting");