fix(gateway): secure control and terminal ownership
This commit is contained in:
@@ -289,6 +289,7 @@ type nativeApolloSession struct {
|
||||
audio chan ProviderMedia
|
||||
events chan ProviderEvent
|
||||
mu sync.Mutex
|
||||
eventMu sync.Mutex
|
||||
mediaMu sync.Mutex
|
||||
controlMu sync.Mutex
|
||||
state protocol.ProviderState
|
||||
@@ -686,10 +687,32 @@ func (s *nativeApolloSession) handleApolloControlPayload(_ uint8, _ bool, payloa
|
||||
}
|
||||
|
||||
func (s *nativeApolloSession) emitProviderEvent(event ProviderEvent) {
|
||||
if !s.enqueueProviderEvent(event) {
|
||||
s.handleApolloDisconnect(ErrProviderMalformed)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *nativeApolloSession) enqueueProviderEvent(event ProviderEvent) bool {
|
||||
s.eventMu.Lock()
|
||||
defer s.eventMu.Unlock()
|
||||
select {
|
||||
case s.events <- event:
|
||||
return true
|
||||
default:
|
||||
s.handleApolloDisconnect(ErrProviderMalformed)
|
||||
}
|
||||
if event.Kind != ProviderEventTerminated && event.Kind != ProviderEventDisconnected {
|
||||
return false
|
||||
}
|
||||
select {
|
||||
case <-s.events:
|
||||
default:
|
||||
return false
|
||||
}
|
||||
select {
|
||||
case s.events <- event:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -706,10 +729,7 @@ func (s *nativeApolloSession) handleApolloDisconnect(err error) {
|
||||
}
|
||||
s.state.State = ProviderStateDisconnected
|
||||
s.mu.Unlock()
|
||||
select {
|
||||
case s.events <- ProviderEvent{Kind: ProviderEventDisconnected}:
|
||||
default:
|
||||
}
|
||||
s.enqueueProviderEvent(ProviderEvent{Kind: ProviderEventDisconnected})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user