moby/daemon/resize.go
Brian Goff 487ea81316 Fix npe in exec resize when exec errored
In cases where an exec start failed the exec process will be nil even
though the channel to signal that the exec started was closed.

Ideally ExecConfig would get a nice refactor to handle this case better
(ie. it's not started so don't close that channel).
This is a minimal fix to prevent NPE. Luckilly this would only get
called by a client and only the http request goroutine gets the panic
(http lib recovers the panic).

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
2023-05-28 00:14:47 +00:00

61 lines
1.7 KiB
Go

package daemon // import "github.com/docker/docker/daemon"
import (
"context"
"errors"
"strconv"
"time"
"github.com/docker/docker/errdefs"
)
// ContainerResize changes the size of the TTY of the process running
// in the container with the given name to the given height and width.
func (daemon *Daemon) ContainerResize(name string, height, width int) error {
container, err := daemon.GetContainer(name)
if err != nil {
return err
}
container.Lock()
tsk, err := container.GetRunningTask()
container.Unlock()
if err != nil {
return err
}
if err = tsk.Resize(context.Background(), uint32(width), uint32(height)); err == nil {
attributes := map[string]string{
"height": strconv.Itoa(height),
"width": strconv.Itoa(width),
}
daemon.LogContainerEventWithAttributes(container, "resize", attributes)
}
return err
}
// ContainerExecResize changes the size of the TTY of the process
// running in the exec with the given name to the given height and
// width.
func (daemon *Daemon) ContainerExecResize(name string, height, width int) error {
ec, err := daemon.getExecConfig(name)
if err != nil {
return err
}
// TODO: the timeout is hardcoded here, it would be more flexible to make it
// a parameter in resize request context, which would need API changes.
timeout := time.NewTimer(10 * time.Second)
defer timeout.Stop()
select {
case <-ec.Started:
// An error may have occurred, so ec.Process may be nil.
if ec.Process == nil {
return errdefs.InvalidParameter(errors.New("exec process is not started"))
}
return ec.Process.Resize(context.Background(), uint32(width), uint32(height))
case <-timeout.C:
return errors.New("timeout waiting for exec session ready")
}
}