erpc icon indicating copy to clipboard operation
erpc copied to clipboard

v7.2.1/socket/socket.go的默认实现 一条协程close 另一条协程WriteMessage 会panic,并不安全

Open WanT0011 opened this issue 8 months ago • 0 comments

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
}

异常示例如图: image

WanT0011 avatar Jun 11 '24 02:06 WanT0011