diff options
author | Jordan Whited <jordan@tailscale.com> | 2023-11-08 14:06:20 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2023-12-11 16:20:49 +0100 |
commit | 1cf89f5339b549236f38ce5fbc40f7bf993d9626 (patch) | |
tree | 25e5ebe8cb6f831705ec2efe895638fc19bba443 | |
parent | 2e0774f246fb4fc1bd5cb44584d033038c89174e (diff) |
tun: fix Device.Read() buf length assumption on Windows
The length of a packet read from the underlying TUN device may exceed
the length of a supplied buffer when MTU exceeds device.MaxMessageSize.
Reviewed-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Signed-off-by: Jordan Whited <jordan@tailscale.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | tun/tun_windows.go | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/tun/tun_windows.go b/tun/tun_windows.go index 34f2980..2af8e3e 100644 --- a/tun/tun_windows.go +++ b/tun/tun_windows.go @@ -160,11 +160,10 @@ retry: packet, err := tun.session.ReceivePacket() switch err { case nil: - packetSize := len(packet) - copy(bufs[0][offset:], packet) - sizes[0] = packetSize + n := copy(bufs[0][offset:], packet) + sizes[0] = n tun.session.ReleaseReceivePacket(packet) - tun.rate.update(uint64(packetSize)) + tun.rate.update(uint64(n)) return 1, nil case windows.ERROR_NO_MORE_ITEMS: if !shouldSpin || uint64(nanotime()-start) >= spinloopDuration { |