go-gost / x

Extended (may be experimental) features outside the main gost tree.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SIGSEGV when specify "direct" dialer with non "direct" connector

vanym opened this issue · comments

commented

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
  1. Check connection for nil in every connector and return error in this case
  2. Make special check for direct connector (add something like "nil connection allowed" interface) and return error if not
  3. "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.

fixed in 82fff49.