Skip to content

websocket.Conn.CloseNow() panics in WaitGroup.Wait #437

Closed
@tomasji

Description

@tomasji

nhooyr.io/websocket v1.8.10

When CloseNow() is called by 2 goroutines, there is a race condition:

panic: sync: WaitGroup is reused before previous Wait has returned

goroutine 105321 [running]:
sync.(*WaitGroup).Wait(0xe33400?)
	/src/sync/waitgroup.go:118 +0x74
nhooyr.io/websocket.(*Conn).CloseNow(0xc02d1e5860)
	/.go/pkg/mod/nhooyr.io/websocket@v1.8.10/close.go:113 +0xcb

Original func

func (c *Conn) CloseNow() (err error) {
	defer c.wg.Wait()
	defer errd.Wrap(&err, "failed to close WebSocket")

	if c.isClosed() {
		return net.ErrClosed
	}
...
}

Possible fix: move defer calls below isClosed()

func (c *Conn) CloseNow() (err error) {
	if c.isClosed() {
		return net.ErrClosed
	}
	defer c.wg.Wait()
	defer errd.Wrap(&err, "failed to close WebSocket")
...
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions