The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5607

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 0da12addab789267082c6279e0624def452fd717 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 27 Mar 2019 17:49:33 -0400
Subject: [PATCH 1/4] lxd/storage: Rename shiftRootfs to initialShiftRootfs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/storage_btrfs.go  | 2 +-
 lxd/storage_ceph.go   | 2 +-
 lxd/storage_dir.go    | 2 +-
 lxd/storage_lvm.go    | 2 +-
 lxd/storage_shared.go | 2 +-
 lxd/storage_zfs.go    | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index e371848e12..2d1d3bfffd 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -945,7 +945,7 @@ func (s *storageBtrfs) ContainerCreateFromImage(container 
container, fingerprint
        }
 
        if !container.IsPrivileged() {
-               err := s.shiftRootfs(container, nil)
+               err := s.initialShiftRootfs(container, nil)
                if err != nil {
                        s.ContainerDelete(container)
                        return errors.Wrap(err, "Failed to shift rootfs")
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 71f834e249..21e513966d 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -973,7 +973,7 @@ func (s *storageCeph) ContainerCreateFromImage(container 
container, fingerprint
        }
 
        if !privileged {
-               err := s.shiftRootfs(container, nil)
+               err := s.initialShiftRootfs(container, nil)
                if err != nil {
                        logger.Errorf(`Failed to shift rootfs for container 
"%s": %s`, containerName, err)
                        return err
diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index 6fe7b3e5b1..046fd8d600 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -549,7 +549,7 @@ func (s *storageDir) ContainerCreateFromImage(container 
container, imageFingerpr
        }
 
        if !privileged {
-               err := s.shiftRootfs(container, nil)
+               err := s.initialShiftRootfs(container, nil)
                if err != nil {
                        return errors.Wrap(err, "Shift rootfs")
                }
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 0a9c3adb72..34d521c985 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -1060,7 +1060,7 @@ func (s *storageLvm) ContainerCreateFromImage(container 
container, fingerprint s
        }
 
        if !container.IsPrivileged() {
-               err := s.shiftRootfs(container, nil)
+               err := s.initialShiftRootfs(container, nil)
                if err != nil {
                        return errors.Wrap(err, "Shift rootfs")
                }
diff --git a/lxd/storage_shared.go b/lxd/storage_shared.go
index 74f8d19c2e..acea19e4a4 100644
--- a/lxd/storage_shared.go
+++ b/lxd/storage_shared.go
@@ -36,7 +36,7 @@ func (s *storageShared) GetStorageTypeVersion() string {
        return s.sTypeVersion
 }
 
-func (s *storageShared) shiftRootfs(c container, skipper func(dir string, 
absPath string, fi os.FileInfo) bool) error {
+func (s *storageShared) initialShiftRootfs(c container, skipper func(dir 
string, absPath string, fi os.FileInfo) bool) error {
        dpath := c.Path()
        rpath := c.RootfsPath()
 
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 0c0f169f4b..a678121c7e 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -920,7 +920,7 @@ func (s *storageZfs) ContainerCreateFromImage(container 
container, fingerprint s
        }
 
        if !privileged {
-               err = s.shiftRootfs(container, zfsIdmapSetSkipper)
+               err = s.initialShiftRootfs(container, zfsIdmapSetSkipper)
                if err != nil {
                        return err
                }

From 1f9a064daeb0a318610cafcc7ba4cd436607f2ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 27 Mar 2019 17:50:24 -0400
Subject: [PATCH 2/4] lxd: Detect shiftfs availability
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/api_1.0.go | 1 +
 lxd/daemon.go  | 7 +++++++
 lxd/sys/os.go  | 1 +
 3 files changed, 9 insertions(+)

diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index 249691f342..9f87b89c90 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -205,6 +205,7 @@ func api10Get(d *Daemon, r *http.Request) Response {
                "netnsid_getifaddrs": fmt.Sprintf("%v", d.os.NetnsGetifaddrs),
                "uevent_injection":   fmt.Sprintf("%v", d.os.UeventInjection),
                "unpriv_fscaps":      fmt.Sprintf("%v", d.os.VFS3Fscaps),
+               "shiftfs":            fmt.Sprintf("%v", d.os.Shiftfs),
        }
 
        drivers := readStoragePoolDriversCache()
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 9059174b97..8aabd26614 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -508,6 +508,13 @@ func (d *Daemon) init() error {
                logger.Infof(" - unprivileged file capabilities: no")
        }
 
+       if util.LoadModule("shiftfs") == nil {
+               d.os.Shiftfs = true
+               logger.Infof(" - shiftfs support: yes")
+       } else {
+               logger.Infof(" - shiftfs support: no")
+       }
+
        /* Initialize the database */
        dump, err := initializeDbObject(d)
        if err != nil {
diff --git a/lxd/sys/os.go b/lxd/sys/os.go
index 8625cd804d..4d548734fa 100644
--- a/lxd/sys/os.go
+++ b/lxd/sys/os.go
@@ -61,6 +61,7 @@ type OS struct {
        NetnsGetifaddrs         bool
        UeventInjection         bool
        VFS3Fscaps              bool
+       Shiftfs                 bool
 
        MockMode bool // If true some APIs will be mocked (for testing)
 }

From 05617be0a763f198bc2208f2074eb5c078edc59b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 27 Mar 2019 17:52:23 -0400
Subject: [PATCH 3/4] lxd/containers: Use LXC hook version 1
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/container_lxc.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 33ff63ad36..e9ddc8154d 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -1149,6 +1149,11 @@ func (c *containerLXC) initLXC(config bool) error {
        }
 
        // Setup the hooks
+       err = lxcSetConfigItem(cc, "lxc.hook.version", "1")
+       if err != nil {
+               return err
+       }
+
        err = lxcSetConfigItem(cc, "lxc.hook.pre-start", fmt.Sprintf("%s 
callhook %s %d start", c.state.OS.ExecPath, shared.VarPath(""), c.id))
        if err != nil {
                return err

From 6ab23d786e0ecb8bff3b86bd8f909dd6ca7f7d18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Wed, 27 Mar 2019 17:53:45 -0400
Subject: [PATCH 4/4] lxd/containers: Fix owner/mode of container path
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/container_lxc.go | 55 ++++++++++++++++++++------------------------
 1 file changed, 25 insertions(+), 30 deletions(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index e9ddc8154d..32b6baa790 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -2038,36 +2038,6 @@ func (c *containerLXC) startCommon() (string, error) {
                        }
                }
 
-               var mode os.FileMode
-               var uid int64
-               var gid int64
-
-               if c.IsPrivileged() {
-                       mode = 0700
-               } else {
-                       mode = 0755
-                       if idmap != nil {
-                               uid, gid = idmap.ShiftIntoNs(0, 0)
-                       }
-               }
-
-               err = os.Chmod(c.Path(), mode)
-               if err != nil {
-                       return "", err
-               }
-
-               err = os.Chown(c.Path(), int(uid), int(gid))
-               if err != nil {
-                       return "", err
-               }
-
-               if ourStart {
-                       _, err = c.StorageStop()
-                       if err != nil {
-                               return "", err
-                       }
-               }
-
                c.updateProgress("")
        }
 
@@ -2411,6 +2381,31 @@ func (c *containerLXC) startCommon() (string, error) {
                return "", err
        }
 
+       // Undo liblxc modifying container directory ownership
+       err = os.Chown(c.Path(), 0, 0)
+       if err != nil {
+               if ourStart {
+                       c.StorageStop()
+               }
+               return "", err
+       }
+
+       // Set right permission to allow traversal
+       var mode os.FileMode
+       if c.IsPrivileged() {
+               mode = 0700
+       } else {
+               mode = 0711
+       }
+
+       err = os.Chmod(c.Path(), mode)
+       if err != nil {
+               if ourStart {
+                       c.StorageStop()
+               }
+               return "", err
+       }
+
        // Update the backup.yaml file
        err = writeBackupFile(c)
        if err != nil {
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to