Skip to content

Commit

Permalink
Fix: multiple port string parsing overflow (#1868)
Browse files Browse the repository at this point in the history
Ports in TCP and UDP should be parsed as an unsigned integer,
otherwise ports > 32767 get truncated to 32767. As this is
the case with Metadata.UDPAddr(), this fundamentally breaks
UDP connections where demand for high port numbers is high.

This commit fixes all known cases where ParseInt is used for ports,
and has been verified to fix Discord voice connections on port
50001~50004.

Fixes: d40e5e4

Co-authored-by: Hamster Tian <[email protected]>
  • Loading branch information
HamsterReserved and updateing authored Jan 1, 2022
1 parent 204a72b commit 8679968
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 5 deletions.
2 changes: 1 addition & 1 deletion adapter/outbound/snell.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func streamConn(c net.Conn, option streamOption) *snell.Snell {
// StreamConn implements C.ProxyAdapter
func (s *Snell) StreamConn(c net.Conn, metadata *C.Metadata) (net.Conn, error) {
c = streamConn(c, streamOption{s.psk, s.version, s.addr, s.obfsOption})
port, _ := strconv.ParseInt(metadata.DstPort, 10, 16)
port, _ := strconv.ParseUint(metadata.DstPort, 10, 16)
err := snell.WriteHeader(c, metadata.String(), uint(port), s.version)
return c, err
}
Expand Down
6 changes: 3 additions & 3 deletions component/dialer/bind_others.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ func bindIfaceToDialer(ifaceName string, dialer *net.Dialer, network string, des
return nil
}

local := int64(0)
local := uint64(0)
if dialer.LocalAddr != nil {
_, port, err := net.SplitHostPort(dialer.LocalAddr.String())
if err == nil {
local, _ = strconv.ParseInt(port, 10, 16)
local, _ = strconv.ParseUint(port, 10, 16)
}
}

Expand All @@ -82,7 +82,7 @@ func bindIfaceToListenConfig(ifaceName string, _ *net.ListenConfig, network, add
port = "0"
}

local, _ := strconv.ParseInt(port, 10, 16)
local, _ := strconv.ParseUint(port, 10, 16)

addr, err := lookupLocalAddr(ifaceName, network, nil, int(local))
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion constant/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func (m *Metadata) UDPAddr() *net.UDPAddr {
if m.NetWork != UDP || m.DstIP == nil {
return nil
}
port, _ := strconv.ParseInt(m.DstPort, 10, 16)
port, _ := strconv.ParseUint(m.DstPort, 10, 16)
return &net.UDPAddr{
IP: m.DstIP,
Port: int(port),
Expand Down

0 comments on commit 8679968

Please sign in to comment.