]> Cypherpunks repositories - gostls13.git/commitdiff
os: drop unnecessary trailing . from symlink targets
authorDamien Neil <dneil@google.com>
Thu, 21 Nov 2024 17:20:46 +0000 (09:20 -0800)
committerDamien Neil <dneil@google.com>
Thu, 21 Nov 2024 22:25:09 +0000 (22:25 +0000)
Adjust splitPathInRoot to match its documented behavior
of dropping . path components except at the end of the path.
This function takes a prefix, path, and suffix; previously
it would preserve a trailing . at the end of the path
even when joining to a suffix.

The practical effect of this change is that we we'll skip
a pointless open of . when following a symlink under some
circumstances:

  - open "a/target"
  - "a" is a symlink to "b/."
  - previously: we rewrite our path to "b/./target"
  - now: we rewrite our path to "b/target"

This is a fairly unimportant edge case, and our observable
behavior isn't changing. The main motivation for this change is
that the overall behavior is more comprehensible if splitPathInRoot
follows its documentation.

Change-Id: I96c6a5e3f489cdac991ba1bd702180d69625bc64
Reviewed-on: https://go-review.googlesource.com/c/go/+/630615
Reviewed-by: Ian Lance Taylor <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/os/root.go
src/os/root_test.go

index d9fc6358a504ce12d69360a9572ec238512e6bee..04741c02810baa35593f3aafc3f4061a9ea22e47 100644 (file)
@@ -230,6 +230,10 @@ func splitPathInRoot(s string, prefix, suffix []string) (_ []string, err error)
                }
                i = j
        }
+       if len(suffix) > 0 && len(parts) > 0 && parts[len(parts)-1] == "." {
+               // Remove a trailing "." component if we're joining to a suffix.
+               parts = parts[:len(parts)-1]
+       }
        parts = append(parts, suffix...)
        return parts, nil
 }
index 95c30606f12a17e76a8744c4254e5bbef4fdaa2d..b461ee220804f9bdc02c9046bc3a922d3758fbde 100644 (file)
@@ -242,6 +242,14 @@ var rootTestCases = []rootTest{{
        },
        open:   "b/../a/target",
        target: "b/c/target",
+}, {
+       name: "symlink ends in dot",
+       fs: []string{
+               "a => b/.",
+               "b/",
+       },
+       open:   "a/target",
+       target: "b/target",
 }, {
        name:        "directory does not exist",
        fs:          []string{},