aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2021-10-19 09:19:50 +0200
committerStefano Brivio <sbrivio@redhat.com>2021-10-19 09:19:50 +0200
commit1bddcf3dd72fe3924b8ad473579daeb922dbf669 (patch)
treeda4dc955ac7ebfc7507ba03adb6e3ef393693a69 /tcp.c
parent9e065b1448bc4df2c031916ef2317e22485ea599 (diff)
downloadpasst-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.gz
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.bz2
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.lz
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.xz
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.zst
passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.zip
tcp: Fix for non-blocking splice() on older kernels
For some reason, on 4.19, splice() doesn't honour SOCK_NONBLOCK from accept4() while reading from a TCP socket. Pass SPLICE_F_NONBLOCK explicitly in all cases. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r--tcp.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/tcp.c b/tcp.c
index 3542827..0093ec4 100644
--- a/tcp.c
+++ b/tcp.c
@@ -3075,7 +3075,7 @@ swap:
retry:
read = splice(move_from, NULL, pipes[1], NULL, c->tcp.pipe_size,
- SPLICE_F_MOVE);
+ SPLICE_F_MOVE | SPLICE_F_NONBLOCK);
if (read < 0) {
if (errno == EINTR)
goto retry;
@@ -3099,7 +3099,7 @@ retry:
eintr:
written = splice(pipes[0], NULL, move_to, NULL, to_write,
- SPLICE_F_MOVE | more);
+ SPLICE_F_MOVE | more | SPLICE_F_NONBLOCK);
/* Most common case: skip updating counters. */
if (read > 0 && read == written) {