Merge pull request #22943 from vdemeester/21769-fix-detach-keys
Fix escape-keys by preserving input if invalid
This commit is contained in:
commit
60abc96acf
|
|
@ -484,7 +484,9 @@ func copyEscapable(dst io.Writer, src io.ReadCloser, keys []byte) (written int64
|
||||||
nr, er := src.Read(buf)
|
nr, er := src.Read(buf)
|
||||||
if nr > 0 {
|
if nr > 0 {
|
||||||
// ---- Docker addition
|
// ---- Docker addition
|
||||||
|
preservBuf := []byte{}
|
||||||
for i, key := range keys {
|
for i, key := range keys {
|
||||||
|
preservBuf = append(preservBuf, buf[0:nr]...)
|
||||||
if nr != 1 || buf[0] != key {
|
if nr != 1 || buf[0] != key {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
@ -496,8 +498,15 @@ func copyEscapable(dst io.Writer, src io.ReadCloser, keys []byte) (written int64
|
||||||
}
|
}
|
||||||
nr, er = src.Read(buf)
|
nr, er = src.Read(buf)
|
||||||
}
|
}
|
||||||
|
var nw int
|
||||||
|
var ew error
|
||||||
|
if len(preservBuf) > 0 {
|
||||||
|
nw, ew = dst.Write(preservBuf)
|
||||||
|
nr = len(preservBuf)
|
||||||
|
} else {
|
||||||
// ---- End of docker
|
// ---- End of docker
|
||||||
nw, ew := dst.Write(buf[0:nr])
|
nw, ew = dst.Write(buf[0:nr])
|
||||||
|
}
|
||||||
if nw > 0 {
|
if nw > 0 {
|
||||||
written += int64(nw)
|
written += int64(nw)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -396,6 +396,55 @@ func (s *DockerSuite) TestRunAttachDetachKeysOverrideConfig(c *check.C) {
|
||||||
c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running"))
|
c.Assert(running, checker.Equals, "true", check.Commentf("expected container to still be running"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DockerSuite) TestRunAttachInvalidDetachKeySequencePreserved(c *check.C) {
|
||||||
|
name := "attach-detach"
|
||||||
|
keyA := []byte{97}
|
||||||
|
keyB := []byte{98}
|
||||||
|
|
||||||
|
dockerCmd(c, "run", "--name", name, "-itd", "busybox", "cat")
|
||||||
|
|
||||||
|
cmd := exec.Command(dockerBinary, "attach", "--detach-keys='a,b,c'", name)
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
cpty, tty, err := pty.Open()
|
||||||
|
if err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
defer cpty.Close()
|
||||||
|
cmd.Stdin = tty
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
c.Assert(waitRun(name), check.IsNil)
|
||||||
|
|
||||||
|
// Invalid escape sequence aba, should print aba in output
|
||||||
|
if _, err := cpty.Write(keyA); err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
if _, err := cpty.Write(keyB); err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
if _, err := cpty.Write(keyA); err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
if _, err := cpty.Write([]byte("\n")); err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := bufio.NewReader(stdout).ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
c.Fatal(err)
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(out) != "aba" {
|
||||||
|
c.Fatalf("expected 'aba', got %q", out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// "test" should be printed
|
// "test" should be printed
|
||||||
func (s *DockerSuite) TestRunWithCPUQuota(c *check.C) {
|
func (s *DockerSuite) TestRunWithCPUQuota(c *check.C) {
|
||||||
testRequires(c, cpuCfsQuota)
|
testRequires(c, cpuCfsQuota)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue