1
0
mirror of https://github.com/golang/go synced 2024-09-29 21:34:28 -06:00

syscall: fix Fchdir on js/wasm

NodeJS does not support fchdir so it has to be emulated with chdir by
saving the path when opening a directory.

However, if the path opened is relative, saving this path is not
sufficient, because after changing the working directory the path
does not resolve correctly any more, thus a subsequent fd.Chdir() fails.

This change fixes the issue by resolving a relative path when
opening the directory and saving the absolute path instead.

Fixes #37448

Change-Id: Id6bc8c4232b0019fc11e850599a526336608ce54
Reviewed-on: https://go-review.googlesource.com/c/go/+/221717
Run-TryBot: Richard Musiol <neelance@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
This commit is contained in:
Richard Musiol 2020-03-01 17:01:58 +01:00 committed by Richard Musiol
parent 7913f7dfcf
commit e44cda3aa9
2 changed files with 39 additions and 0 deletions

View File

@ -1242,6 +1242,41 @@ func testChtimes(t *testing.T, name string) {
}
}
func TestFileChdir(t *testing.T) {
// TODO(brainman): file.Chdir() is not implemented on windows.
if runtime.GOOS == "windows" {
return
}
wd, err := Getwd()
if err != nil {
t.Fatalf("Getwd: %s", err)
}
defer Chdir(wd)
fd, err := Open(".")
if err != nil {
t.Fatalf("Open .: %s", err)
}
defer fd.Close()
if err := Chdir("/"); err != nil {
t.Fatalf("Chdir /: %s", err)
}
if err := fd.Chdir(); err != nil {
t.Fatalf("fd.Chdir: %s", err)
}
wdNew, err := Getwd()
if err != nil {
t.Fatalf("Getwd: %s", err)
}
if wdNew != wd {
t.Fatalf("fd.Chdir failed, got %s, want %s", wdNew, wd)
}
}
func TestChdirAndGetwd(t *testing.T) {
// TODO(brainman): file.Chdir() is not implemented on windows.
if runtime.GOOS == "windows" {

View File

@ -102,6 +102,10 @@ func Open(path string, openmode int, perm uint32) (int, error) {
}
}
if path[0] != '/' {
cwd := jsProcess.Call("cwd").String()
path = cwd + "/" + path
}
f := &jsFile{
path: path,
entries: entries,