Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/goPublic

Commit018854d

Browse files
committed
[release-branch.go1.1] bufio: check buffer availability before reading in ReadFrom
This change was applied by hand, as bufio has seen some refactoringsince 1.1 was branched. The only difference between this and theoriginal patch is the offset of the change, and s/flush/Flush/.««« CL 11801043 / 3ffbc06b4874bufio: check buffer availability before reading in ReadFromFixes issue 5947 .R=golang-dev, bradfitzCC=golang-devhttps://golang.org/cl/11801043»»»Update#5928R=golang-dev, rCC=golang-devhttps://golang.org/cl/12002043
1 parent2041d55 commit018854d

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

‎src/pkg/bufio/bufio.go‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -585,23 +585,28 @@ func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) {
585585
}
586586
varmint
587587
for {
588+
ifb.Available()==0 {
589+
iferr1:=b.Flush();err1!=nil {
590+
returnn,err1
591+
}
592+
}
588593
m,err=r.Read(b.buf[b.n:])
589594
ifm==0 {
590595
break
591596
}
592597
b.n+=m
593598
n+=int64(m)
594-
ifb.Available()==0 {
595-
iferr1:=b.Flush();err1!=nil {
596-
returnn,err1
597-
}
598-
}
599599
iferr!=nil {
600600
break
601601
}
602602
}
603603
iferr==io.EOF {
604-
err=nil
604+
// If we filled the buffer exactly, flush pre-emptively.
605+
ifb.Available()==0 {
606+
err=b.Flush()
607+
}else {
608+
err=nil
609+
}
605610
}
606611
returnn,err
607612
}

‎src/pkg/bufio/bufio_test.go‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,10 @@ func TestWriterReadFrom(t *testing.T) {
847847
t.Errorf("ws[%d],rs[%d]: w.ReadFrom(r) = %d, %v, want %d, nil",wi,ri,n,err,len(input))
848848
continue
849849
}
850+
iferr:=w.Flush();err!=nil {
851+
t.Errorf("Flush returned %v",err)
852+
continue
853+
}
850854
ifgot,want:=b.String(),string(input);got!=want {
851855
t.Errorf("ws[%d], rs[%d]:\ngot %q\nwant %q\n",wi,ri,got,want)
852856
}
@@ -1003,6 +1007,24 @@ func TestReaderClearError(t *testing.T) {
10031007
}
10041008
}
10051009

1010+
// Test for golang.org/issue/5947
1011+
funcTestWriterReadFromWhileFull(t*testing.T) {
1012+
buf:=new(bytes.Buffer)
1013+
w:=NewWriterSize(buf,10)
1014+
1015+
// Fill buffer exactly.
1016+
n,err:=w.Write([]byte("0123456789"))
1017+
ifn!=10||err!=nil {
1018+
t.Fatalf("Write returned (%v, %v), want (10, nil)",n,err)
1019+
}
1020+
1021+
// Use ReadFrom to read in some data.
1022+
n2,err:=w.ReadFrom(strings.NewReader("abcdef"))
1023+
ifn2!=6||err!=nil {
1024+
t.Fatalf("ReadFrom returned (%v, %v), want (6, nil)",n,err)
1025+
}
1026+
}
1027+
10061028
// An onlyReader only implements io.Reader, no matter what other methods the underlying implementation may have.
10071029
typeonlyReaderstruct {
10081030
r io.Reader

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp