protect socket variable with mutex; fix #437

This commit is contained in:
Cenk Alti 2018-12-25 11:23:47 +03:00
parent fcbc168ae6
commit 1b7ce4c378
No known key found for this signature in database
GPG key ID: 2DB2EA6FD1BF1761

View file

@ -49,6 +49,7 @@ func (cfg Config) LogFields() log.Fields {
// Frontend holds the state of a UDP BitTorrent Frontend. // Frontend holds the state of a UDP BitTorrent Frontend.
type Frontend struct { type Frontend struct {
socket *net.UDPConn socket *net.UDPConn
m sync.Mutex
closing chan struct{} closing chan struct{}
wg sync.WaitGroup wg sync.WaitGroup
@ -103,10 +104,20 @@ func (t *Frontend) Stop() stop.Result {
c := make(stop.Channel) c := make(stop.Channel)
go func() { go func() {
t.m.Lock()
defer t.m.Unlock()
close(t.closing) close(t.closing)
t.socket.SetReadDeadline(time.Now()) if t.socket != nil {
t.socket.SetReadDeadline(time.Now())
}
t.wg.Wait() t.wg.Wait()
c.Done(t.socket.Close())
var err error
if t.socket != nil {
err = t.socket.Close()
}
c.Done(err)
}() }()
return c.Result() return c.Result()
@ -120,7 +131,9 @@ func (t *Frontend) listenAndServe() error {
return err return err
} }
t.m.Lock()
t.socket, err = net.ListenUDP("udp", udpAddr) t.socket, err = net.ListenUDP("udp", udpAddr)
t.m.Unlock()
if err != nil { if err != nil {
return err return err
} }