aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-11-01 00:17:05 -0400
committerRuss Cox <rsc@golang.org>2011-11-01 00:17:05 -0400
commit4853c51770f5e99d5d690801e5cb963848591587 (patch)
treefadf1d2fc913cfb409ede28441f10a6cf841b6e4
parent9db3f78c392643769fd46fc7900a6deb1fd2692f (diff)
downloadgo-4853c51770f5e99d5d690801e5cb963848591587.tar.gz
go-4853c51770f5e99d5d690801e5cb963848591587.zip
os: do not interpret 0-length read as EOF
Fixes #2402. R=golang-dev, bradfitz, r CC=golang-dev https://golang.org/cl/5298081
-rw-r--r--src/pkg/os/file.go2
-rw-r--r--src/pkg/os/os_test.go21
2 files changed, 22 insertions, 1 deletions
diff --git a/src/pkg/os/file.go b/src/pkg/os/file.go
index 4335d45e5a..9f982e183a 100644
--- a/src/pkg/os/file.go
+++ b/src/pkg/os/file.go
@@ -69,7 +69,7 @@ func (file *File) Read(b []byte) (n int, err Error) {
if n < 0 {
n = 0
}
- if n == 0 && !iserror(e) {
+ if n == 0 && len(b) > 0 && !iserror(e) {
return 0, EOF
}
if iserror(e) {
diff --git a/src/pkg/os/os_test.go b/src/pkg/os/os_test.go
index f9bacebf11..1547ce0dbf 100644
--- a/src/pkg/os/os_test.go
+++ b/src/pkg/os/os_test.go
@@ -165,6 +165,27 @@ func TestLstat(t *testing.T) {
}
}
+// Read with length 0 should not return EOF.
+func TestRead0(t *testing.T) {
+ path := sfdir + "/" + sfname
+ f, err := Open(path)
+ if err != nil {
+ t.Fatal("open failed:", err)
+ }
+ defer f.Close()
+
+ b := make([]byte, 0)
+ n, err := f.Read(b)
+ if n != 0 || err != nil {
+ t.Errorf("Read(0) = %d, %v, want 0, nil", n, err)
+ }
+ b = make([]byte, 100)
+ n, err = f.Read(b)
+ if n <= 0 || err != nil {
+ t.Errorf("Read(100) = %d, %v, want >0, nil", n, err)
+ }
+}
+
func testReaddirnames(dir string, contents []string, t *testing.T) {
file, err := Open(dir)
defer file.Close()