summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbluhm <bluhm@openbsd.org>2011-03-13 01:27:23 +0000
committerbluhm <bluhm@openbsd.org>2011-03-13 01:27:23 +0000
commit111c676c88aaa52a33742f40d04df650aacea937 (patch)
tree3b2560b3795e5beabcc04561bcf91668fe18be88
parentChange daddr_t to daddr32_t. The bootblocks on our architectures only (diff)
downloadwireguard-openbsd-111c676c88aaa52a33742f40d04df650aacea937.tar.xz
wireguard-openbsd-111c676c88aaa52a33742f40d04df650aacea937.zip
Test that reading from a spliced socket does not return eof if there
is still data in the receive socket buffer.
-rw-r--r--regress/sys/kern/splice/args-relay-read-eof.pl27
-rw-r--r--regress/sys/kern/splice/funcs.pl10
2 files changed, 35 insertions, 2 deletions
diff --git a/regress/sys/kern/splice/args-relay-read-eof.pl b/regress/sys/kern/splice/args-relay-read-eof.pl
new file mode 100644
index 00000000000..3287c099572
--- /dev/null
+++ b/regress/sys/kern/splice/args-relay-read-eof.pl
@@ -0,0 +1,27 @@
+# test waiting for splice finish with read and eof has happend
+
+use strict;
+use warnings;
+
+our %args = (
+ client => {
+ # fill server buffer, relay send buffer, half relay recv buffer
+ # then send eof
+ len => 2**13 + 2**10,
+ },
+ relay => {
+ nonblocking => 1,
+ readblocking => 1,
+ sndbuf => 2**12,
+ rcvbuf => 2**12,
+ },
+ server => {
+ # wait until all buffers are filled and client sends eof
+ func => sub { sleep 4; read_char(@_); },
+ rcvbuf => 2**12,
+ },
+ len => 9216,
+ md5 => "6d263239be35ccf30cb04c5f58a35dbe",
+);
+
+1;
diff --git a/regress/sys/kern/splice/funcs.pl b/regress/sys/kern/splice/funcs.pl
index 973b5db8e6e..e294e403c69 100644
--- a/regress/sys/kern/splice/funcs.pl
+++ b/regress/sys/kern/splice/funcs.pl
@@ -1,4 +1,4 @@
-# $OpenBSD: funcs.pl,v 1.3 2011/03/12 18:58:54 bluhm Exp $
+# $OpenBSD: funcs.pl,v 1.4 2011/03/13 01:27:23 bluhm Exp $
# Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org>
#
@@ -195,8 +195,14 @@ sub relay_splice {
or die ref($self), " splice stdin to stdout failed: $!";
if ($self->{readblocking}) {
+ my $read;
# block by reading from the source socket
- defined(my $read = sysread(STDIN, my $buf, 2**16))
+ do {
+ # busy loop to test soreceive
+ $read = sysread(STDIN, my $buf, 2**16);
+ } while ($self->{nonblocking} && !defined($read) &&
+ $!{EAGAIN});
+ defined($read)
or die ref($self), " read blocking failed: $!";
$read > 0 and die ref($self),
" read blocking has data: $read";