]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.2] os: do not return Lstat errors from Readdir
authorAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:26:31 +0000 (11:26 +1100)
committerAndrew Gerrand <adg@golang.org>
Fri, 1 Nov 2013 00:26:31 +0000 (11:26 +1100)
««« CL 18870043 / eca0ca43a863
os: do not return Lstat errors from Readdir

This CL restores the Go 1.1.2 semantics for os.File's Readdir method.

The code in Go 1.1.2 was rewritten mainly because it looked buggy.
This new version attempts to be clearer but still provide the 1.1.2 results.

The important diff is not this CL's version against tip but this CL's version
against Go 1.1.2.

Go 1.1.2:

        names, err := f.Readdirnames(n)
        fi = make([]FileInfo, len(names))
        for i, filename := range names {
                fip, err := Lstat(dirname + filename)
                if err == nil {
                        fi[i] = fip
                } else {
                        fi[i] = &fileStat{name: filename}
                }
        }
        return fi, err

This CL:

        names, err := f.Readdirnames(n)
        fi = make([]FileInfo, len(names))
        for i, filename := range names {
                fip, lerr := lstat(dirname + filename)
                if lerr != nil {
                        fi[i] = &fileStat{name: filename}
                        continue
                }
                fi[i] = fip
        }
        return fi, err

The changes from Go 1.1.2 are stylistic, not semantic:
1. Use lstat instead of Lstat, for testing (done before this CL).
2. Make error handling in loop body look more like an error case.
3. Use separate error variable name in loop body, to be clear
   we are not trying to influence the final return result.

Fixes #6656.
Fixes #6680.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/18870043
»»»

R=golang-dev
CC=golang-dev
https://golang.org/cl/20110045

src/pkg/os/file_unix.go
src/pkg/os/os_unix_test.go

index 376e380bc98801c9e01743bb5232c3f1b2dbd86a..ff1a597e70b59ca9ff110da63ae5f6705b9e2d94 100644 (file)
@@ -165,14 +165,11 @@ func (f *File) readdir(n int) (fi []FileInfo, err error) {
        fi = make([]FileInfo, len(names))
        for i, filename := range names {
                fip, lerr := lstat(dirname + filename)
-               if lerr == nil {
-                       fi[i] = fip
-               } else {
+               if lerr != nil {
                        fi[i] = &fileStat{name: filename}
-                       if err == nil {
-                               err = lerr
-                       }
+                       continue
                }
+               fi[i] = fip
        }
        return fi, err
 }
index 80d57aa4222e0938edd1a705b118d1addf5ce337..b0fc0256de415a4cdf1e4b3865f5f2aec4baef4d 100644 (file)
@@ -92,8 +92,8 @@ func TestReaddirWithBadLstat(t *testing.T) {
        defer func() { *LstatP = Lstat }()
 
        dirs, err := handle.Readdir(-1)
-       if err != ErrInvalid {
-               t.Fatalf("Expected Readdir to return ErrInvalid, got %v", err)
+       if err != nil {
+               t.Fatalf("Expected Readdir to return no error, got %v", err)
        }
        foundfail := false
        for _, dir := range dirs {