erpc
erpc copied to clipboard
v7.2.1/socket/socket.go的默认实现 一条协程close 另一条协程WriteMessage 会panic,并不安全
version: v7.2.1 问题:github.com/andeya/erpc/[email protected]/socket/socket.go:35 的socket接口说是并发安全的;但是在一个协程执行close操作,另一个协程执行WriteMessage方法时可能会出现panic;具体是 在protocol.Pack(message)的时候 protocol为空,因为它已经在close中置为了nil;
func (s *socket) WriteMessage(message Message) error {
s.mu.RLock()
protocol := s.protocol
s.mu.RUnlock()
err := protocol.Pack(message)
if err != nil && s.isActiveClosed() {
err = ErrProactivelyCloseSocket
}
return err
}
异常示例如图: