From cf557f0eb17ca23a90a556871aa8b277be0c6c8a Mon Sep 17 00:00:00 2001 From: xjasonlyu Date: Sat, 27 Nov 2021 13:27:44 +0800 Subject: [PATCH] Fix: control should return error --- component/dialer/bind_darwin.go | 20 +++++++++++++------- component/dialer/bind_linux.go | 16 +++++++++++----- component/dialer/fwmark_linux.go | 14 ++++++++++---- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/component/dialer/bind_darwin.go b/component/dialer/bind_darwin.go index dfc693d..b4901b0 100755 --- a/component/dialer/bind_darwin.go +++ b/component/dialer/bind_darwin.go @@ -8,19 +8,25 @@ import ( ) func bindToInterface(i *net.Interface) controlFunc { - return func(network, address string, c syscall.RawConn) error { - ipStr, _, _ := net.SplitHostPort(address) - if ip := net.ParseIP(ipStr); ip != nil && !ip.IsGlobalUnicast() { - return nil + return func(network, address string, c syscall.RawConn) (err error) { + host, _, _ := net.SplitHostPort(address) + if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() { + return } - return c.Control(func(fd uintptr) { + var innerErr error + err = c.Control(func(fd uintptr) { switch network { case "tcp4", "udp4": - unix.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, i.Index) + innerErr = unix.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BOUND_IF, i.Index) case "tcp6", "udp6": - unix.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, i.Index) + innerErr = unix.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BOUND_IF, i.Index) } }) + + if innerErr != nil { + err = innerErr + } + return } } diff --git a/component/dialer/bind_linux.go b/component/dialer/bind_linux.go index 76decc3..7237fb2 100755 --- a/component/dialer/bind_linux.go +++ b/component/dialer/bind_linux.go @@ -8,14 +8,20 @@ import ( ) func bindToInterface(i *net.Interface) controlFunc { - return func(network, address string, c syscall.RawConn) error { - ipStr, _, _ := net.SplitHostPort(address) - if ip := net.ParseIP(ipStr); ip != nil && !ip.IsGlobalUnicast() { + return func(network, address string, c syscall.RawConn) (err error) { + host, _, _ := net.SplitHostPort(address) + if ip := net.ParseIP(host); ip != nil && !ip.IsGlobalUnicast() { return nil } - return c.Control(func(fd uintptr) { - unix.BindToDevice(int(fd), i.Name) + var innerErr error + err = c.Control(func(fd uintptr) { + innerErr = unix.BindToDevice(int(fd), i.Name) }) + + if innerErr != nil { + err = innerErr + } + return } } diff --git a/component/dialer/fwmark_linux.go b/component/dialer/fwmark_linux.go index 2a55f06..8b0cbbd 100644 --- a/component/dialer/fwmark_linux.go +++ b/component/dialer/fwmark_linux.go @@ -6,10 +6,16 @@ import ( "golang.org/x/sys/unix" ) -func setMark(i int) controlFunc { - return func(_, _ string, c syscall.RawConn) error { - return c.Control(func(fd uintptr) { - unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_MARK, i) +func setMark(m int) controlFunc { + return func(_, _ string, c syscall.RawConn) (err error) { + var innerErr error + err = c.Control(func(fd uintptr) { + innerErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_MARK, m) }) + + if innerErr != nil { + err = innerErr + } + return } }