Drop messages on closed connections

This prevents this panic:

    panic: send on closed channel
    goroutine 9 [running]:
    git.sr.ht/~emersion/soju.(*upstreamConn).SendMessage(...)
            /home/simon/src/soju/upstream.go:866
    git.sr.ht/~emersion/soju.(*upstreamConn).handleMessage(0xc000084b40, 0xc000144680, 0x2, 0x0)
            /home/simon/src/soju/upstream.go:152 +0x62b
    git.sr.ht/~emersion/soju.(*user).run(0xc0000b8070)
            /home/simon/src/soju/user.go:144 +0x53d
    created by git.sr.ht/~emersion/soju.(*Server).Run
            /home/simon/src/soju/server.go:88 +0x286
This commit is contained in:
Simon Ser 2020-03-21 08:29:44 +01:00
parent 7114c8a1e9
commit cb52f393f4
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48

View File

@ -148,11 +148,19 @@ func (u *user) run() {
select { select {
case upstreamMsg := <-u.upstreamIncoming: case upstreamMsg := <-u.upstreamIncoming:
msg, uc := upstreamMsg.msg, upstreamMsg.uc msg, uc := upstreamMsg.msg, upstreamMsg.uc
if uc.closed {
uc.logger.Printf("ignoring message on closed connection: %v", msg)
break
}
if err := uc.handleMessage(msg); err != nil { if err := uc.handleMessage(msg); err != nil {
uc.logger.Printf("failed to handle message %q: %v", msg, err) uc.logger.Printf("failed to handle message %q: %v", msg, err)
} }
case downstreamMsg := <-u.downstreamIncoming: case downstreamMsg := <-u.downstreamIncoming:
msg, dc := downstreamMsg.msg, downstreamMsg.dc msg, dc := downstreamMsg.msg, downstreamMsg.dc
if dc.isClosed() {
dc.logger.Printf("ignoring message on closed connection: %v", msg)
break
}
err := dc.handleMessage(msg) err := dc.handleMessage(msg)
if ircErr, ok := err.(ircError); ok { if ircErr, ok := err.(ircError); ok {
ircErr.Message.Prefix = dc.srv.prefix() ircErr.Message.Prefix = dc.srv.prefix()