]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.24] os: avoid panic in Root when symlink references the root
authorDamien Neil <dneil@google.com>
Thu, 27 Mar 2025 23:22:38 +0000 (16:22 -0700)
committerCarlos Amedee <carlos@golang.org>
Thu, 3 Apr 2025 18:49:16 +0000 (11:49 -0700)
We would panic when opening a symlink ending in ..,
where the symlink references the root itself.

For #73081
Fixes #73082

Change-Id: I7dc3f041ca79df7942feec58c197fde6881ecae5
Reviewed-on: https://go-review.googlesource.com/c/go/+/661416
Reviewed-by: Alan Donovan <adonovan@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit cfc784a152ebbc4fc0b8bf13c02e0f6eb9c980bd)
Reviewed-on: https://go-review.googlesource.com/c/go/+/662315

src/os/root_openat.go
src/os/root_test.go

index a03208b4c170e9b511e6b24f4593bfef0ccab6b2..6fc02a1a0718cf020001a5aad6a55f2b00c1dd4b 100644 (file)
@@ -146,6 +146,9 @@ func doInRoot[T any](r *Root, name string, f func(parent sysfdType, name string)
                                return ret, errPathEscapes
                        }
                        parts = slices.Delete(parts, i-count, end)
+                       if len(parts) == 0 {
+                               parts = []string{"."}
+                       }
                        i = 0
                        if dirfd != rootfd {
                                syscall.Close(dirfd)
index cbb985b2ceeb484484c04ea3d7f47baac553bc51..6f6f6cc82670d66f18bef302a5830bef8e778557 100644 (file)
@@ -1176,6 +1176,33 @@ func TestRootRaceRenameDir(t *testing.T) {
        }
 }
 
+func TestRootSymlinkToRoot(t *testing.T) {
+       dir := makefs(t, []string{
+               "d/d => ..",
+       })
+       root, err := os.OpenRoot(dir)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer root.Close()
+       if err := root.Mkdir("d/d/new", 0777); err != nil {
+               t.Fatal(err)
+       }
+       f, err := root.Open("d/d")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer f.Close()
+       names, err := f.Readdirnames(-1)
+       if err != nil {
+               t.Fatal(err)
+       }
+       slices.Sort(names)
+       if got, want := names, []string{"d", "new"}; !slices.Equal(got, want) {
+               t.Errorf("root contains: %q, want %q", got, want)
+       }
+}
+
 func TestOpenInRoot(t *testing.T) {
        dir := makefs(t, []string{
                "file",