Fix: should close all endpoint on exit

This commit is contained in:
kr328 2021-05-22 01:29:25 +08:00
parent 42f5331a0c
commit 634c25894c

View File

@ -9,13 +9,18 @@ import (
)
type context struct {
stack tun2socket.Stack
device *os.File
stack tun2socket.Stack
}
var lock sync.Mutex
var tun *context
func (ctx *context) close() {
_ = ctx.stack.Close()
_ = ctx.device.Close()
}
func Start(fd, mtu int, dns string) error {
lock.Lock()
defer lock.Unlock()
@ -33,11 +38,15 @@ func Start(fd, mtu int, dns string) error {
return err
}
ctx := &context{
device: device,
stack: stack,
}
go func() {
// device -> lwip
defer device.Close()
defer stack.Close()
defer ctx.close()
buf := make([]byte, mtu)
@ -54,8 +63,7 @@ func Start(fd, mtu int, dns string) error {
go func() {
// lwip -> device
defer device.Close()
defer stack.Close()
defer ctx.close()
buf := make([]byte, mtu)
@ -72,7 +80,7 @@ func Start(fd, mtu int, dns string) error {
go func() {
// lwip tcp
defer stack.TCP().Close()
defer ctx.close()
for {
conn, err := stack.TCP().Accept()
@ -96,7 +104,7 @@ func Start(fd, mtu int, dns string) error {
go func() {
// lwip udp
defer stack.UDP().Close()
defer ctx.close()
for {
buf := allocUDP(mtu)
@ -123,10 +131,7 @@ func Start(fd, mtu int, dns string) error {
}
}()
tun = &context{
stack: stack,
device: device,
}
tun = ctx
return nil
}
@ -140,8 +145,7 @@ func Stop() {
func stopLocked() {
if tun != nil {
tun.device.Close()
tun.stack.Close()
tun.close()
}
tun = nil