]> Cypherpunks repositories - gostls13.git/commitdiff
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)
committerDamien Neil <dneil@google.com>
Fri, 28 Mar 2025 05:25:37 +0000 (22:25 -0700)
We would panic when opening a symlink ending in ..,
where the symlink references the root itself.

Fixes #73081

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>

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

index 65918256486c2a9d2227a6c272232eb5481eee8e..f67794cd720f6d5eabcc61176a6e3096c62d152f 100644 (file)
@@ -226,6 +226,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 7db8ce0e5845eff436dc0e46161fb1994821320e..7b8eae03a11908884a8be5a872f39de5dedfd4f6 100644 (file)
@@ -1596,6 +1596,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",