xjasonlyu / tun2socks

tun2socks - powered by gVisor TCP/IP stack
https://github.com/xjasonlyu/tun2socks/wiki
GNU General Public License v3.0
2.85k stars 404 forks source link

[Bug] engine.Stop method stucks #236

Closed coder-free closed 11 months ago

coder-free commented 1 year ago

Verify steps

Version

6cfc25309e35d2c9873864a8b04fffa884a8b4e9

What OS are you seeing the problem on?

macOS

Description

你好,我使用类似于这样的方式启动 tun2socks,在取消阻塞后 engine.Stop() 被调用的时候卡住了

Start() {
    var key = new(engine.Key)
    log := "info"
    if len(logLevel) > 0 {
        log = logLevel
    }
    key.Proxy = proxy
    key.LogLevel = log
    key.MTU = mtu
    key.TCPReceiveBufferSize = "131072"
    key.TCPSendBufferSize = "131072"

    engine.Insert(key)
    engine.Start()
    defer engine.Stop()
        //阻塞

}

Stop() {
       //取消阻塞
}

具体来说卡在了 gvisor stack 的 wait 方法上:

func stop() (err error) {
    log.Errorf("stop 1.")
    _engineMu.Lock()
    log.Errorf("stop 2.")
    if _defaultDevice != nil {
        log.Errorf("stop 3.")
        err = _defaultDevice.Close()
        log.Errorf("stop 4: %v", err)
    }
    if _defaultStack != nil {
        log.Errorf("stop 5.")
        _defaultStack.Close()
        log.Errorf("stop 6.")
        _defaultStack.Wait()
        log.Errorf("stop 7.")
    }
    _engineMu.Unlock()
    log.Errorf("stop 8.")
    return err
}

stop 6 被打印出来,但是 stop 7 一直未出现。

另外,key里面没有device,我是自己创建了一个 io.ReadWriter 来模拟 device 提供数据的读写接口。 像下面这样创建 device:

func open(mtu uint32, rw io.ReadWriter) (device.Device, error) {
    f := &FD{mtu: mtu}
    ep, err := iobased.New(rw, mtu, 0)
    if err != nil {
        return nil, fmt.Errorf("create endpoint: %w", err)
    }
    f.LinkEndpoint = ep

    return f, nil
}

CLI or Config

No response

Logs

No response

How to Reproduce

No response

github-actions[bot] commented 11 months ago

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days