Merge pull request from GHSA-2qjp-425j-52j9
CRI stream server: Fix goroutine leak in Exec
This commit is contained in:
commit
241563be06
@ -33,6 +33,7 @@ limitations under the License.
|
|||||||
package remotecommand
|
package remotecommand
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
gocontext "context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -132,7 +133,7 @@ func createStreams(req *http.Request, w http.ResponseWriter, opts *Options, supp
|
|||||||
|
|
||||||
if ctx.resizeStream != nil {
|
if ctx.resizeStream != nil {
|
||||||
ctx.resizeChan = make(chan remotecommand.TerminalSize)
|
ctx.resizeChan = make(chan remotecommand.TerminalSize)
|
||||||
go handleResizeEvents(ctx.resizeStream, ctx.resizeChan)
|
go handleResizeEvents(req.Context(), ctx.resizeStream, ctx.resizeChan)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx, true
|
return ctx, true
|
||||||
@ -425,7 +426,7 @@ WaitForStreams:
|
|||||||
// supportsTerminalResizing returns false because v1ProtocolHandler doesn't support it.
|
// supportsTerminalResizing returns false because v1ProtocolHandler doesn't support it.
|
||||||
func (*v1ProtocolHandler) supportsTerminalResizing() bool { return false }
|
func (*v1ProtocolHandler) supportsTerminalResizing() bool { return false }
|
||||||
|
|
||||||
func handleResizeEvents(stream io.Reader, channel chan<- remotecommand.TerminalSize) {
|
func handleResizeEvents(ctx gocontext.Context, stream io.Reader, channel chan<- remotecommand.TerminalSize) {
|
||||||
defer runtime.HandleCrash()
|
defer runtime.HandleCrash()
|
||||||
defer close(channel)
|
defer close(channel)
|
||||||
|
|
||||||
@ -435,7 +436,15 @@ func handleResizeEvents(stream io.Reader, channel chan<- remotecommand.TerminalS
|
|||||||
if err := decoder.Decode(&size); err != nil {
|
if err := decoder.Decode(&size); err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
channel <- size
|
|
||||||
|
select {
|
||||||
|
case channel <- size:
|
||||||
|
case <-ctx.Done():
|
||||||
|
// To avoid leaking this routine, exit if the http request finishes. This path
|
||||||
|
// would generally be hit if starting the process fails and nothing is started to
|
||||||
|
// ingest these resize events.
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user