[lxc-devel] [lxd/master] lxc/file: Follow symlinks on individual file transfers

stgraber on Github lxc-bot at linuxcontainers.org
Mon Feb 10 20:59:37 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/20200210/a5b9087c/attachment.bin>
-------------- next part --------------
From 844c70cfb5942a1dea97a3282b21b5819cfd0633 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 10 Feb 2020 15:58:38 -0500
Subject: [PATCH 1/2] shared: Add HostPathFollow
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 | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/shared/util.go b/shared/util.go
index 43b11b495c..ffaa750b9d 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -106,6 +106,23 @@ func IsUnixSocket(path string) bool {
 	return (stat.Mode() & os.ModeSocket) == os.ModeSocket
 }
 
+// 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 {
+	for {
+		target, err := os.Readlink(path)
+		if err != nil {
+			return path
+		}
+
+		if target == path {
+			return path
+		}
+
+		path = HostPath(target)
+	}
+}
+
 // HostPath returns the host path for the provided path
 // On a normal system, this does nothing
 // When inside of a snap environment, returns the real path

From 0a33b7065266b1bd9b5c6c8e7297eec273fbdbcb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 10 Feb 2020 15:59:10 -0500
Subject: [PATCH 2/2] lxc/file: Follow symlinks on individual file transfers
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>
---
 lxc/file.go | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lxc/file.go b/lxc/file.go
index 83c5255f1c..aa7167a84b 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -535,6 +535,9 @@ 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