From d51abeb6c75b98f6b435799d1edeabcef936eec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 19 Jun 2023 13:22:05 +0800 Subject: [PATCH] Prevent panic when write packet with bad address type --- gvisor_udp.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gvisor_udp.go b/gvisor_udp.go index 8d7a01e..fff72e0 100644 --- a/gvisor_udp.go +++ b/gvisor_udp.go @@ -13,6 +13,7 @@ import ( "github.com/sagernet/gvisor/pkg/tcpip/header" "github.com/sagernet/gvisor/pkg/tcpip/stack" "github.com/sagernet/sing/common/buf" + E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/common/udpnat" @@ -62,6 +63,12 @@ type UDPBackWriter struct { } func (w *UDPBackWriter) WritePacket(packetBuffer *buf.Buffer, destination M.Socksaddr) error { + if destination.IsIPv4() && w.sourceNetwork == header.IPv6ProtocolNumber { + destination = M.SocksaddrFrom(netip.AddrFrom16(destination.Addr.As16()), destination.Port) + } else if destination.IsIPv6() && (w.sourceNetwork == header.IPv4AddressSizeBits) { + return E.New("send IPv6 packet to IPv4 connection") + } + defer packetBuffer.Release() route, err := w.stack.FindRoute(