diff options
author | Jordan Whited <jordan@tailscale.com> | 2023-03-06 15:58:32 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2023-03-10 14:52:24 +0100 |
commit | 2fcdaf979915be4702bf8aba4a90ac3c3ae0796b (patch) | |
tree | 5850a80bb1c6e49fdcd36f6d29e0b15f3a27eb0e /conn/bind_std_test.go | |
parent | dbd949307e75bbd72d86e53aa57b74b20daab04d (diff) |
conn: fix StdNetBind fallback on Windows
If RIO is unavailable, NewWinRingBind() falls back to StdNetBind.
StdNetBind uses x/net/ipv{4,6}.PacketConn for sending and receiving
datagrams, specifically via the {Read,Write}Batch methods.
These methods are unimplemented on Windows and will return runtime
errors as a result. Additionally, only Linux benefits from these
x/net types for reading and writing, so we update StdNetBind to fall
back to the standard library net package for all platforms other than
Linux.
Reviewed-by: James Tucker <james@tailscale.com>
Signed-off-by: Jordan Whited <jordan@tailscale.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'conn/bind_std_test.go')
-rw-r--r-- | conn/bind_std_test.go | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/conn/bind_std_test.go b/conn/bind_std_test.go new file mode 100644 index 0000000..76afa30 --- /dev/null +++ b/conn/bind_std_test.go @@ -0,0 +1,22 @@ +package conn + +import "testing" + +func TestStdNetBindReceiveFuncAfterClose(t *testing.T) { + bind := NewStdNetBind().(*StdNetBind) + fns, _, err := bind.Open(0) + if err != nil { + t.Fatal(err) + } + bind.Close() + buffs := make([][]byte, 1) + buffs[0] = make([]byte, 1) + sizes := make([]int, 1) + eps := make([]Endpoint, 1) + for _, fn := range fns { + // The ReceiveFuncs must not access conn-related fields on StdNetBind + // unguarded. Close() nils the conn-related fields resulting in a panic + // if they violate the mutex. + fn(buffs, sizes, eps) + } +} |