SrtSocket.Close() leaks callbacks due to overwriting socket before cleanup
Description
(*SrtSocket).Close() sets s.socket = SRT_INVALID_SOCK before attempting to clean up listenCallbackMap and connectCallbackMap.
Because the socket value is overwritten too early, the map lookups always fail. This results in:
gopointer.Unref never being called → memory leaks
- map entries never being removed → map leaks
Current Code (buggy)
func (s *SrtSocket) Close() {
C.srt_close(s.socket)
s.socket = SRT_INVALID_SOCK
if !s.blocking {
s.pd.close()
}
callbackMutex.Lock()
if ptr, exists := listenCallbackMap[s.socket]; exists {
gopointer.Unref(ptr)
}
if ptr, exists := connectCallbackMap[s.socket]; exists {
gopointer.Unref(ptr)
}
callbackMutex.Unlock()
}
Proposed Fix
func (s *SrtSocket) Close() {
sock := s.socket
if sock == SRT_INVALID_SOCK {
return
}
callbackMutex.Lock()
if ptr, ok := listenCallbackMap[sock]; ok {
gopointer.Unref(ptr)
delete(listenCallbackMap, sock)
}
if ptr, ok := connectCallbackMap[sock]; ok {
gopointer.Unref(ptr)
delete(connectCallbackMap, sock)
}
callbackMutex.Unlock()
if !s.blocking && s.pd != nil {
s.pd.close()
}
C.srt_close(sock)
s.socket = SRT_INVALID_SOCK
}
SrtSocket.Close() leaks callbacks due to overwriting socket before cleanup
Description
(*SrtSocket).Close()setss.socket = SRT_INVALID_SOCKbefore attempting to clean uplistenCallbackMapandconnectCallbackMap.Because the socket value is overwritten too early, the map lookups always fail. This results in:
gopointer.Unrefnever being called → memory leaksCurrent Code (buggy)
Proposed Fix