]> Cypherpunks repositories - gostls13.git/commitdiff
os: do not interpret 0-length read as EOF
authorRuss Cox <rsc@golang.org>
Tue, 1 Nov 2011 04:17:05 +0000 (00:17 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 1 Nov 2011 04:17:05 +0000 (00:17 -0400)
Fixes #2402.

R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/5298081

src/pkg/os/file.go
src/pkg/os/os_test.go

index 4335d45e5a0edd07b60861fe8e03d43fc462c884..9f982e183a2676262ba6a816a210c5fde453f7eb 100644 (file)
@@ -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) {
index f9bacebf113b325fb7d3f0f9198fa2247a80b212..1547ce0dbf1c628964f0d24efe6faf4067007d3a 100644 (file)
@@ -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()