diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go index 56de33a7fd..3cd85515d4 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder.go @@ -126,8 +126,8 @@ func (d *YAMLDecoder) Read(data []byte) (n int, err error) { } // caller will need to reread - copy(data, d.remaining[:left]) - d.remaining = d.remaining[left:] + copy(data, d.remaining[:len(data)]) + d.remaining = d.remaining[len(data):] return len(data), io.ErrShortBuffer } diff --git a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go index 3c1ad7b221..03e502ec69 100644 --- a/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go @@ -54,6 +54,36 @@ stuff: 1 } } +func TestYAMLDecoderCallsAfterErrShortBufferRestOfFrame(t *testing.T) { + d := `--- +stuff: 1 + test-foo: 1` + r := NewDocumentDecoder(ioutil.NopCloser(bytes.NewReader([]byte(d)))) + b := make([]byte, 12) + n, err := r.Read(b) + if err != io.ErrShortBuffer || n != 12 { + t.Fatalf("expected ErrShortBuffer: %d / %v", n, err) + } + expected := "---\nstuff: 1" + if string(b) != expected { + t.Fatalf("expected bytes read to be: %s got: %s", expected, string(b)) + } + b = make([]byte, 13) + n, err = r.Read(b) + if err != nil || n != 13 { + t.Fatalf("expected nil: %d / %v", n, err) + } + expected = "\n\ttest-foo: 1" + if string(b) != expected { + t.Fatalf("expected bytes read to be: '%s' got: '%s'", expected, string(b)) + } + b = make([]byte, 15) + n, err = r.Read(b) + if err != io.EOF || n != 0 { + t.Fatalf("expected EOF: %d / %v", n, err) + } +} + func TestSplitYAMLDocument(t *testing.T) { testCases := []struct { input string