diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2022-11-17 18:49:35 +0000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2022-11-25 01:40:57 +0100 |
commit | 190169c544744d38a280fff0499f764642dad2e3 (patch) | |
tree | c55fbf6fb7998f6faa75ecbbc1c4c626a7d6352e | |
parent | 6b4e68383c66bd8a3863d9a708bae583d18dc056 (diff) | |
download | passt-190169c544744d38a280fff0499f764642dad2e3.tar passt-190169c544744d38a280fff0499f764642dad2e3.tar.gz passt-190169c544744d38a280fff0499f764642dad2e3.tar.bz2 passt-190169c544744d38a280fff0499f764642dad2e3.tar.lz passt-190169c544744d38a280fff0499f764642dad2e3.tar.xz passt-190169c544744d38a280fff0499f764642dad2e3.tar.zst passt-190169c544744d38a280fff0499f764642dad2e3.zip |
passt, tap: Process data on the socket before HUP/ERR events
In the case where the client writes a packet and then closes the
socket, because we receive EPOLLIN|EPOLLRDHUP together we have a
choice of whether to close the socket immediately, or read the packet
and then close the socket. Choose the latter.
This should improve fuzzing coverage and arguably is a better choice
even for regular use since dropping packets on close is bad.
See-also: https://archives.passt.top/passt-dev/20221117171805.3746f53a@elisabeth/
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r-- | tap.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -1106,13 +1106,13 @@ void tap_handler(struct ctx *c, int fd, uint32_t events, return; } - if (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)) - goto reinit; - if ((c->mode == MODE_PASST && tap_handler_passt(c, now)) || (c->mode == MODE_PASTA && tap_handler_pasta(c, now))) goto reinit; + if (events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR)) + goto reinit; + return; reinit: if (c->one_off) { |