Remove 4in6 cast

This commit is contained in:
世界 2022-09-25 17:59:18 +08:00
parent 86d7d51023
commit b12b8b7fd2
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
7 changed files with 36 additions and 24 deletions

View file

@ -30,7 +30,7 @@ func (w *ExtendedUDPConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
return M.Socksaddr{}, err
}
buffer.Truncate(n)
return M.SocksaddrFromNetIP(addr), nil
return M.SocksaddrFromNetIP(addr).Unwrap(), nil
}
func (w *ExtendedUDPConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
@ -58,7 +58,7 @@ func (w *ExtendedPacketConn) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error)
if err != nil {
return M.Socksaddr{}, err
}
return M.SocksaddrFromNet(addr), err
return M.SocksaddrFromNet(addr).Unwrap(), err
}
func (w *ExtendedPacketConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {

View file

@ -6,6 +6,8 @@ import (
"strconv"
"strings"
"unsafe"
"github.com/sagernet/sing/common/debug"
)
type Socksaddr struct {
@ -19,15 +21,15 @@ func (ap Socksaddr) Network() string {
}
func (ap Socksaddr) IsIP() bool {
return ap.Addr.IsValid() && ap.Fqdn == ""
return ap.Addr.IsValid()
}
func (ap Socksaddr) IsIPv4() bool {
return ap.Addr.Is4() || ap.Addr.Is4In6()
return ap.Addr.Is4()
}
func (ap Socksaddr) IsIPv6() bool {
return ap.Addr.Is6() && !ap.Addr.Is4In6()
return ap.Addr.Is6()
}
func (ap Socksaddr) Unwrap() Socksaddr {
@ -41,7 +43,7 @@ func (ap Socksaddr) Unwrap() Socksaddr {
}
func (ap Socksaddr) IsFqdn() bool {
return !ap.Addr.IsValid() && IsDomainName(ap.Fqdn)
return IsDomainName(ap.Fqdn)
}
func (ap Socksaddr) IsValid() bool {
@ -49,6 +51,9 @@ func (ap Socksaddr) IsValid() bool {
}
func (ap Socksaddr) AddrString() string {
if debug.Enabled {
ap.CheckBadAddr()
}
if ap.Addr.IsValid() {
return ap.Addr.String()
} else {
@ -57,12 +62,18 @@ func (ap Socksaddr) AddrString() string {
}
func (ap Socksaddr) IPAddr() *net.IPAddr {
if debug.Enabled {
ap.CheckBadAddr()
}
return &net.IPAddr{
IP: ap.Addr.AsSlice(),
}
}
func (ap Socksaddr) TCPAddr() *net.TCPAddr {
if debug.Enabled {
ap.CheckBadAddr()
}
return &net.TCPAddr{
IP: ap.Addr.AsSlice(),
Port: int(ap.Port),
@ -70,6 +81,9 @@ func (ap Socksaddr) TCPAddr() *net.TCPAddr {
}
func (ap Socksaddr) UDPAddr() *net.UDPAddr {
if debug.Enabled {
ap.CheckBadAddr()
}
return &net.UDPAddr{
IP: ap.Addr.AsSlice(),
Port: int(ap.Port),
@ -77,24 +91,22 @@ func (ap Socksaddr) UDPAddr() *net.UDPAddr {
}
func (ap Socksaddr) AddrPort() netip.AddrPort {
if debug.Enabled {
ap.CheckBadAddr()
}
return *(*netip.AddrPort)(unsafe.Pointer(&ap))
}
func (ap Socksaddr) String() string {
if debug.Enabled {
ap.CheckBadAddr()
}
return net.JoinHostPort(ap.AddrString(), strconv.Itoa(int(ap.Port)))
}
func TCPAddr(ap netip.AddrPort) *net.TCPAddr {
return &net.TCPAddr{
IP: ap.Addr().AsSlice(),
Port: int(ap.Port()),
}
}
func UDPAddr(ap netip.AddrPort) *net.UDPAddr {
return &net.UDPAddr{
IP: ap.Addr().AsSlice(),
Port: int(ap.Port()),
func (ap Socksaddr) CheckBadAddr() {
if ap.Addr.Is4In6() || ap.Addr.IsValid() && ap.Fqdn != "" {
panic("bad socksaddr")
}
}

View file

@ -62,7 +62,7 @@ func (s *Serializer) WriteAddress(buffer *buf.Buffer, addr Socksaddr) error {
return err
}
if addr.Addr.IsValid() {
_, err = buffer.Write(addr.Unwrap().Addr.AsSlice())
_, err = buffer.Write(addr.Addr.AsSlice())
} else {
err = WriteSocksString(buffer, addr.Fqdn)
}

2
go.mod
View file

@ -2,4 +2,4 @@ module github.com/sagernet/sing
go 1.18
require golang.org/x/sys v0.0.0-20220913120320-3275c407cedc
require golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8

4
go.sum
View file

@ -1,2 +1,2 @@
golang.org/x/sys v0.0.0-20220913120320-3275c407cedc h1:dpclq5m2YrqPGStKmtw7IcNbKLfbIqKXvNxDJKdIKYc=
golang.org/x/sys v0.0.0-20220913120320-3275c407cedc/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

View file

@ -18,5 +18,5 @@ func SourceAddress(request *http.Request) M.Socksaddr {
}
}
}
return address
return address.Unwrap()
}

View file

@ -96,7 +96,7 @@ func WriteRequest(writer io.Writer, request Request) error {
binary.Write(buffer, binary.BigEndian, request.Destination.Port),
)
if request.Destination.IsIPv4() {
common.Must1(buffer.Write(request.Destination.Unwrap().Addr.AsSlice()))
common.Must1(buffer.Write(request.Destination.Addr.AsSlice()))
} else {
// 0.0.0.X
common.Must(buffer.WriteZeroN(3))
@ -153,7 +153,7 @@ func WriteResponse(writer io.Writer, response Response) error {
buffer.WriteByte(0),
buffer.WriteByte(response.ReplyCode),
binary.Write(buffer, binary.BigEndian, response.Destination.Port),
common.Error(buffer.Write(response.Destination.Unwrap().Addr.AsSlice())),
common.Error(buffer.Write(response.Destination.Addr.AsSlice())),
)
return rw.WriteBytes(writer, buffer.Bytes())
}