SIGSEGV when specify "direct" dialer with non "direct" connector
vanym opened this issue · comments
App crashes when using node with "direct" dialer and non "direct" connector
$ ./gost-linux-amd64-3.0.0-rc.0 -C configv3directcrash.yaml
{"handler":"socks5","kind":"service","level":"info","listener":"tcp","msg":"listening on [::]:1080/tcp","service":"socks-0","time":"…"}
{"handler":"socks5","kind":"handler","level":"info","listener":"tcp","local":"127.0.0.1:1080","msg":"127.0.0.1:39054 <> 127.0.0.1:1080","remote":"127.0.0.1:39054","service":"socks-0","time":"…"}
{"duration":3982118,"handler":"socks5","kind":"handler","level":"info","listener":"tcp","local":"127.0.0.1:1080","msg":"127.0.0.1:39054 >< 127.0.0.1:1080","remote":"127.0.0.1:39054","service":"socks-0","time":"…"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xc53973]
goroutine 81 [running]:
github.com/go-gost/x/connector/socks/v5.(*socks5Connector).Handshake(0xc00007ccc0, {0x1471650?, 0xc00007ccc0?}, {0x0, 0x0})
/home/gerry/code/go-gost/x/connector/socks/v5/connector.go:71 +0x73
github.com/go-gost/core/chain.(*Transport).Handshake(0xc00007cd20, {0x1478bf8, 0xc0006e4750}, {0x0?, 0x0?})
/home/gerry/code/go-gost/core/chain/transport.go:103 +0x19d
github.com/go-gost/x/chain.(*route).connect(0xc0006e5260, {0x1478bf8, 0xc0006e4750}, {0x1488cb0, 0xc0008263e8})
/home/gerry/code/go-gost/x/chain/route.go:158 +0x2db
github.com/go-gost/x/chain.(*route).Dial(0xc0006e5260, {0x1478bf8, 0xc0006e4750}, {0x1297d30, 0x3}, {0xc000412170, 0xa}, {0xc0000d0180, 0x3, 0x3})
/home/gerry/code/go-gost/x/chain/route.go:61 +0x15e
github.com/go-gost/core/chain.(*Router).dial(0xc0005f6100, {0x1478bf8, 0xc0006e4750}, {0x1297d30, 0x3}, {0xc000412170, 0xa})
/home/gerry/code/go-gost/core/chain/router.go:181 +0x58f
github.com/go-gost/core/chain.(*Router).Dial(0xc000412170?, {0x1478bf8, 0xc0006e4750}, {0x1297d30, 0x3}, {0xc000412170, 0xa})
/home/gerry/code/go-gost/core/chain/router.go:119 +0xee
github.com/go-gost/x/handler/socks/v5.(*socks5Handler).handleConnect(0xc0003a3f40, {0x1478bf8, 0xc0006e4750}, {0x1481a40, 0xc000378040}, {0x1297d30, 0x3}, {0xc000412170, 0xa}, {0x1488cb0, ...})
/home/gerry/code/go-gost/x/handler/socks/v5/connect.go:34 +0x3fe
github.com/go-gost/x/handler/socks/v5.(*socks5Handler).Handle(0xc0003a3f40, {0x1478bf8, 0xc0006e4750}, {0x1481a40, 0xc000378040}, {0xc00062c010?, 0xc0006e97b8?, 0xbc1893?})
/home/gerry/code/go-gost/x/handler/socks/v5/handler.go:102 +0x7b3
github.com/go-gost/x/service.(*defaultService).Serve.func1()
/home/gerry/code/go-gost/x/service/service.go:186 +0x534
created by github.com/go-gost/x/service.(*defaultService).Serve
/home/gerry/code/go-gost/x/service/service.go:162 +0x530
To Reproduce
configv3directcrash.yaml
services:
- name: socks-0
addr: ":1080"
handler:
type: socks5
chain: chain-0
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: 127.0.0.1:9050
connector:
type: socks5
dialer:
type: direct
Run gost
./gost-linux-amd64-3.0.0-rc.0 -C configv3directcrash.yaml
Make request
curl --socks5-hostname "127.0.0.1:1080" -v "https://ifconfig.me"
Expected behavior
Node should return error, but do not crash app
Thoughts about options to solve
- Check connection for nil in every connector and return error in this case
- Make special check for direct connector (add something like "nil connection allowed" interface) and return error if not
- "Direct" dialer will return non nil, but dummy connection which will return error on any function call and empty addrs
P.S.
Buy the way, name "direct" for dialer that do nothing is confusing (my first thought was that is same as "tcp"). May be consider renaming or alias it to "none"
Also I think "direct" connector should check that connection passed to it is nil or dummy and return error if not or may be just close whatever is passed
I prefer option 3, direct dialer can only work with direct connector, a dummy connection is reasonable.
A direct
node is not a real node, so virtual
as an alias may be more intuitive.