]> Cypherpunks repositories - gostls13.git/commitdiff
os: fix race condition between (*os.File).Stat and os.Chdir on windows
authorHiroshi Ioka <hirochachacha@gmail.com>
Mon, 28 Dec 2015 12:35:48 +0000 (21:35 +0900)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 30 Dec 2015 06:37:08 +0000 (06:37 +0000)
Fixes #13752

Change-Id: I53cfc4ecae90c35b6f1074f3be08489c408a6464
Reviewed-on: https://go-review.googlesource.com/18181
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/os/os_windows_test.go
src/os/stat_windows.go

index 66e5d42b00deae55c366178a945f7e3f9cc0d9a5..3f4a01e9838a827281eee04ac611c4266d012360 100644 (file)
@@ -150,3 +150,32 @@ func TestBadNetPathError(t *testing.T) {
                t.Fatal("os.IsNotExist(syscall.Errno(53)) is false, but want true")
        }
 }
+
+func TestStatDir(t *testing.T) {
+       defer chtmpdir(t)()
+
+       f, err := os.Open(".")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer f.Close()
+
+       fi, err := f.Stat()
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       err = os.Chdir("..")
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       fi2, err := f.Stat()
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       if !os.SameFile(fi, fi2) {
+               t.Fatal("race condition occured")
+       }
+}
index 966163b2babcd3a1d7796eee6595ab9a75a1f64e..0b6c22c8e8233ec0c85e967eaa76e982ecbe9647 100644 (file)
@@ -20,7 +20,7 @@ func (file *File) Stat() (FileInfo, error) {
        }
        if file.isdir() {
                // I don't know any better way to do that for directory
-               return Stat(file.name)
+               return Stat(file.dirinfo.path)
        }
        if file.name == DevNull {
                return &devNullStat, nil