Skip to content

Commit

Permalink
fix: don't panic when listen on localhost
Browse files Browse the repository at this point in the history
  • Loading branch information
wwqgtxx committed Nov 27, 2024
1 parent fbead56 commit 9de9f1e
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions adapter/inbound/listen.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package inbound

import (
"context"
"fmt"
"net"
"net/netip"
"sync"

"github.com/metacubex/mihomo/component/keepalive"
Expand Down Expand Up @@ -42,6 +44,27 @@ func MPTCP() bool {
}

func ListenContext(ctx context.Context, network, address string) (net.Listener, error) {
switch network { // like net.Resolver.internetAddrList but filter domain to avoid call net.Resolver.lookupIPAddr
case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6", "ip", "ip4", "ip6":
if host, port, err := net.SplitHostPort(address); err == nil {
switch host {
case "localhost":
switch network {
case "tcp6", "udp6", "ip6":
address = net.JoinHostPort("::1", port)
default:
address = net.JoinHostPort("127.0.0.1", port)
}
case "": // internetAddrList can handle this special case
break
default:
if _, err := netip.ParseAddr(host); err != nil { // not ip
return nil, fmt.Errorf("invalid network address: %s", address)
}
}
}
}

mutex.RLock()
defer mutex.RUnlock()
return lc.Listen(ctx, network, address)
Expand Down

0 comments on commit 9de9f1e

Please sign in to comment.