From 06e9b3151585573818df8d890c0be1dc576500e6 Mon Sep 17 00:00:00 2001 From: jingrui Date: Mon, 1 Feb 2021 16:56:40 +0800 Subject: [PATCH] docker: fix hijack hang Change-Id: Ica0fe7806227114acfe028b44dfeed70a5dd4577 Signed-off-by: jingrui --- .../docker/docker/client/container_exec.go | 18 ++++++++- .../dockerd/hack/malformed_host_override.go | 37 +++++++++++-------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/components/cli/vendor/github.com/docker/docker/client/container_exec.go b/components/cli/vendor/github.com/docker/docker/client/container_exec.go index 535536b1e0..ac458e9c30 100644 --- a/components/cli/vendor/github.com/docker/docker/client/container_exec.go +++ b/components/cli/vendor/github.com/docker/docker/client/container_exec.go @@ -3,6 +3,8 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" + "fmt" + "time" "github.com/docker/docker/api/types" ) @@ -36,8 +38,20 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config // and the a reader to get output. It's up to the called to close // the hijacked connection by calling types.HijackedResponse.Close. func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) { - headers := map[string][]string{"Content-Type": {"application/json"}} - return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) + done := make(chan struct{}) + var resp types.HijackedResponse + var err error + go func() { + headers := map[string][]string{"Content-Type": {"application/json"}} + resp, err = cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) + close(done) + }() + select { + case <-done: + return resp, err + case <-time.After(5 * time.Minute): + return resp, fmt.Errorf("post exec hijacked timeout") + } } // ContainerExecInspect returns information about a specific exec process on the docker host. -- 2.17.1