mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-07-05 18:48:31 +00:00
Fix panic sending on closed client.MessageChannel
This commit is contained in:
parent
601b5501a7
commit
33bf762a00
3 changed files with 35 additions and 22 deletions
|
@ -85,22 +85,20 @@ func HandleReady(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (r
|
|||
client.MakePendingRequests = nil
|
||||
client.Mutex.Unlock()
|
||||
|
||||
if disconnectAt == 0 {
|
||||
// backlog only
|
||||
go func() {
|
||||
client.MessageChannel <- ClientMessage{MessageID: msg.MessageID, Command: SuccessCommand}
|
||||
SendBacklogForNewClient(client)
|
||||
}()
|
||||
return ClientMessage{Command: AsyncResponseCommand}, nil
|
||||
} else {
|
||||
// backlog and timed
|
||||
go func() {
|
||||
client.MessageChannel <- ClientMessage{MessageID: msg.MessageID, Command: SuccessCommand}
|
||||
SendBacklogForNewClient(client)
|
||||
SendTimedBacklogMessages(client, time.Unix(disconnectAt, 0))
|
||||
}()
|
||||
return ClientMessage{Command: AsyncResponseCommand}, nil
|
||||
client.MsgChannelKeepalive.RLock()
|
||||
if client.MessageChannel == nil {
|
||||
return
|
||||
}
|
||||
|
||||
client.MessageChannel <- ClientMessage{MessageID: msg.MessageID, Command: SuccessCommand}
|
||||
SendBacklogForNewClient(client)
|
||||
if disconnectAt != 0 {
|
||||
SendTimedBacklogMessages(client, time.Unix(disconnectAt, 0))
|
||||
}
|
||||
client.MsgChannelKeepalive.RUnlock()
|
||||
}()
|
||||
return ClientMessage{Command: AsyncResponseCommand}, nil
|
||||
}
|
||||
|
||||
func HandleSetUser(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||||
|
@ -193,10 +191,14 @@ func GetSubscriptionBacklog(conn *websocket.Conn, client *ClientInfo) {
|
|||
}
|
||||
|
||||
// Deliver to client
|
||||
client.MsgChannelKeepalive.RLock()
|
||||
if client.MessageChannel != nil {
|
||||
for _, msg := range messages {
|
||||
client.MessageChannel <- msg
|
||||
}
|
||||
}
|
||||
client.MsgChannelKeepalive.RUnlock()
|
||||
}
|
||||
|
||||
func HandleSurvey(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||||
// Discard
|
||||
|
@ -318,11 +320,15 @@ func HandleRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMes
|
|||
go func(conn *websocket.Conn, msg ClientMessage, authInfo AuthInfo) {
|
||||
resp, err := RequestRemoteDataCached(string(msg.Command), msg.origArguments, authInfo)
|
||||
|
||||
client.MsgChannelKeepalive.RLock()
|
||||
if client.MessageChannel != nil {
|
||||
if err != nil {
|
||||
client.MessageChannel <- ClientMessage{MessageID: msg.MessageID, Command: ErrorCommand, Arguments: err.Error()}
|
||||
} else {
|
||||
client.MessageChannel <- ClientMessage{MessageID: msg.MessageID, Command: SuccessCommand, origArguments: resp}
|
||||
}
|
||||
}
|
||||
client.MsgChannelKeepalive.RUnlock()
|
||||
}(conn, msg, client.AuthInfo)
|
||||
|
||||
return ClientMessage{Command: AsyncResponseCommand}, nil
|
||||
|
|
|
@ -247,6 +247,10 @@ RunLoop:
|
|||
// Stop getting messages...
|
||||
UnsubscribeAll(&client)
|
||||
|
||||
client.MsgChannelKeepalive.Lock()
|
||||
client.MessageChannel = nil
|
||||
client.MsgChannelKeepalive.Unlock()
|
||||
|
||||
// And finished.
|
||||
// Close the channel so the draining goroutine can finish, too.
|
||||
close(_serverMessageChan)
|
||||
|
|
|
@ -85,9 +85,12 @@ type ClientInfo struct {
|
|||
MakePendingRequests *time.Timer
|
||||
|
||||
// Server-initiated messages should be sent here
|
||||
// Never nil.
|
||||
// This field will be nil before it is closed.
|
||||
MessageChannel chan<- ClientMessage
|
||||
|
||||
// Take a read-lock on this before checking whether MessageChannel is nil.
|
||||
MsgChannelKeepalive sync.RWMutex
|
||||
|
||||
// The number of pings sent without a response
|
||||
pingCount int
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue