[lxc-devel] [lxd/master] lxc/file: Expand complex symlink chains
stgraber on Github
lxc-bot at linuxcontainers.org
Thu Feb 13 21:14:25 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200213/d2d56302/attachment.bin>
-------------- next part --------------
From 17356bee9218a311688299cac52bd8f6adb4fc77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 13 Feb 2020 16:13:37 -0500
Subject: [PATCH 1/2] shared/util: Tweak HostPathFollow to use readlink
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
shared/util.go | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/shared/util.go b/shared/util.go
index 0db130129f..aae5defc6f 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -109,20 +109,22 @@ func IsUnixSocket(path string) bool {
// HostPathFollow takes a valid path (from HostPath) and resolves it
// all the way to its target or to the last which can be resolved.
func HostPathFollow(path string) string {
- // Check if the path is already snap-aware
- for _, prefix := range []string{"/dev", "/snap", "/var/snap", "/var/lib/snapd"} {
- if path == prefix || strings.HasPrefix(path, fmt.Sprintf("%s/", prefix)) {
- return path
- }
+ // Check if we're running in a snap package.
+ _, inSnap := os.LookupEnv("SNAP")
+ snapName := os.Getenv("SNAP_NAME")
+ if !inSnap || snapName != "lxd" {
+ return path
}
+ // Rely on "readlink -m" to do the right thing.
for {
- target, err := os.Readlink(path)
+ target, err := RunCommand("readlink", "-m", path)
if err != nil {
return path
}
+ target = strings.TrimSpace(target)
- if target == path {
+ if path == HostPath(target) {
return path
}
From 47ec76da72533100a019b0f14cf3dd4efe3433c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 13 Feb 2020 16:13:40 -0500
Subject: [PATCH 2/2] lxc/file: Expand complex symlink chains
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #6874
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxc/file.go | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/lxc/file.go b/lxc/file.go
index aa7167a84b..82c8fe26b3 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -235,7 +235,7 @@ func (c *cmdFilePull) Run(cmd *cobra.Command, args []string) error {
}
// Determine the target
- target := shared.HostPath(filepath.Clean(args[len(args)-1]))
+ target := shared.HostPathFollow(filepath.Clean(args[len(args)-1]))
targetIsDir := false
sb, err := os.Stat(target)
if err != nil && !os.IsNotExist(err) {
@@ -457,7 +457,7 @@ func (c *cmdFilePush) Run(cmd *cobra.Command, args []string) error {
// Make a list of paths to transfer
sourcefilenames := []string{}
for _, fname := range args[:len(args)-1] {
- sourcefilenames = append(sourcefilenames, shared.HostPath(filepath.Clean(fname)))
+ sourcefilenames = append(sourcefilenames, shared.HostPathFollow(filepath.Clean(fname)))
}
// Determine the target mode
@@ -483,7 +483,7 @@ func (c *cmdFilePush) Run(cmd *cobra.Command, args []string) error {
// Create needed paths if requested
if c.file.flagMkdir {
- f, err := os.Open(args[0])
+ f, err := os.Open(sourcefilenames[0])
if err != nil {
return err
}
@@ -535,9 +535,6 @@ func (c *cmdFilePush) Run(cmd *cobra.Command, args []string) error {
if f == "-" {
file = os.Stdin
} else {
- // Follow symlinks within the snap environment.
- f = shared.HostPathFollow(f)
-
file, err = os.Open(f)
if err != nil {
return err
More information about the lxc-devel
mailing list