From 9280703ff722135dbad8c4b5e13cd7374e3f3c74 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Tue, 16 Feb 2016 15:19:33 -0800 Subject: [PATCH] Fix buffer corruption in ReadUntil --- gexpect.go | 4 ++-- gexpect_test.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gexpect.go b/gexpect.go index 5948b15..4d1e872 100644 --- a/gexpect.go +++ b/gexpect.go @@ -332,7 +332,7 @@ func (expect *ExpectSubprocess) Interact() { } func (expect *ExpectSubprocess) ReadUntil(delim byte) ([]byte, error) { - join := make([]byte, 1, 512) + join := make([]byte, 0, 512) chunk := make([]byte, 255) for { @@ -346,7 +346,7 @@ func (expect *ExpectSubprocess) ReadUntil(delim byte) ([]byte, error) { for i := 0; i < n; i++ { if chunk[i] == delim { if len(chunk) > i+1 { - expect.buf.PutBack(chunk[i+1:]) + expect.buf.PutBack(chunk[i+1:n]) } return join, nil } else { diff --git a/gexpect_test.go b/gexpect_test.go index 364ebc1..44a383b 100644 --- a/gexpect_test.go +++ b/gexpect_test.go @@ -178,3 +178,26 @@ func TestRegexFind(t *testing.T) { } } } + +func TestReadLine(t *testing.T) { + t.Logf("Testing ReadLine...") + + child, err := Spawn("echo -e \"foo\nbar\"") + if err != nil { + t.Fatal(err) + } + s, err := child.ReadLine() + if err != nil { + t.Fatal(err) + } + if s != "foo\r" { + t.Fatalf("expected 'foo\\r', got '%s'", s) + } + s, err = child.ReadLine() + if err != nil { + t.Fatal(err) + } + if s != "bar\r" { + t.Fatalf("expected 'bar\\r', got '%s'", s) + } +}