]> Cypherpunks repositories - gostls13.git/commitdiff
os: do not report ModeDir for symlinks on windows
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 26 Apr 2017 04:49:58 +0000 (14:49 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 26 Apr 2017 23:17:23 +0000 (23:17 +0000)
When using Lstat against symlinks that point to a directory,
the function returns FileInfo with both ModeDir and ModeSymlink set.
Change that to never set ModeDir if ModeSymlink is set.

Fixes #10424
Fixes #17540
Fixes #17541

Change-Id: Iba280888aad108360b8c1f18180a24493fe7ad2b
Reviewed-on: https://go-review.googlesource.com/41830
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/archive/tar/tar_test.go
src/os/os_windows_test.go
src/os/types_windows.go
src/path/filepath/path_test.go
src/path/filepath/path_windows_test.go

index 10a16dd5d08caecc6e27cd04fbd546b5247d21d6..1cb7ec2525ad3de2a034cf5e26bde3d78953f2bd 100644 (file)
@@ -12,7 +12,6 @@ import (
        "path"
        "path/filepath"
        "reflect"
-       "runtime"
        "strings"
        "testing"
        "time"
@@ -72,9 +71,6 @@ func TestFileInfoHeaderDir(t *testing.T) {
 func TestFileInfoHeaderSymlink(t *testing.T) {
        testenv.MustHaveSymlink(t)
 
-       if runtime.GOOS == "windows" {
-               t.Skip("skipping broken test: see issue 17541")
-       }
        tmpdir, err := ioutil.TempDir("", "TestFileInfoHeaderSymlink")
        if err != nil {
                t.Fatal(err)
index 3e82f6993b1beaf2808a1613dfd557c77c47bf3d..84066dee00a0316cbf70f6b336616e99bd0ec9b2 100644 (file)
@@ -153,6 +153,20 @@ func testDirLinks(t *testing.T, tests []dirLinkTest) {
                        t.Errorf("%q should point to %q", link, dir)
                        continue
                }
+
+               fi2, err := os.Lstat(link)
+               if err != nil {
+                       t.Errorf("failed to lstat link %v: %v", link, err)
+                       continue
+               }
+               if m := fi2.Mode(); m&os.ModeSymlink == 0 {
+                       t.Errorf("%q should be a link, but is not (mode=0x%x)", link, uint32(m))
+                       continue
+               }
+               if m := fi2.Mode(); m&os.ModeDir != 0 {
+                       t.Errorf("%q should be a link, not a directory (mode=0x%x)", link, uint32(m))
+                       continue
+               }
        }
 }
 
index 772b9e5d24abe8e365f10207cab27dcfead98d5a..a0d6fa4e767f6d214f965befbd1ac9d049fa6b4e 100644 (file)
@@ -32,16 +32,16 @@ func (fs *fileStat) Mode() (m FileMode) {
        if fs == &devNullStat {
                return ModeDevice | ModeCharDevice | 0666
        }
-       if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
-               m |= ModeDir | 0111
-       }
        if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_READONLY != 0 {
                m |= 0444
        } else {
                m |= 0666
        }
        if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 {
-               m |= ModeSymlink
+               return m | ModeSymlink
+       }
+       if fs.sys.FileAttributes&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
+               m |= ModeDir | 0111
        }
        switch fs.filetype {
        case syscall.FILE_TYPE_PIPE:
index d2a78f5bee48bba658724363e805195406e5378a..315f61e3ad87040d25562aeb4d43a67a40939a3f 100644 (file)
@@ -1377,8 +1377,5 @@ func testWalkSymlink(t *testing.T, mklink func(target, link string) error) {
 
 func TestWalkSymlink(t *testing.T) {
        testenv.MustHaveSymlink(t)
-       if runtime.GOOS == "windows" {
-               t.Skip("skipping broken test: see issue 17540")
-       }
        testWalkSymlink(t, os.Symlink)
 }
index 066377874455246da90030cafb8a467acc0ba03f..d759a83f38dc535bf9903d270f13b12e95c72a9a 100644 (file)
@@ -451,12 +451,10 @@ func testWalkMklink(t *testing.T, linktype string) {
 
 func TestWalkDirectoryJunction(t *testing.T) {
        testenv.MustHaveSymlink(t)
-       t.Skip("skipping broken test: see issue 10424")
        testWalkMklink(t, "J")
 }
 
 func TestWalkDirectorySymlink(t *testing.T) {
        testenv.MustHaveSymlink(t)
-       t.Skip("skipping broken test: see issue 17540")
        testWalkMklink(t, "D")
 }