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

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) ===
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 3326c17e2686df9d543f0b4b47665e8dd991e170 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Fri, 13 Mar 2020 11:12:14 +0100
Subject: [PATCH 1/2] tree-wide: add missing O_CLOEXEC

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/bindings.c | 4 ++--
 src/lxcfs.c    | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/bindings.c b/src/bindings.c
index 45555d5..4eadbe0 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -525,12 +525,12 @@ static int pivot_enter()
 {
        __do_close_prot_errno int oldroot = -EBADF, newroot = -EBADF;
 
-       oldroot = open("/", O_DIRECTORY | O_RDONLY);
+       oldroot = open("/", O_DIRECTORY | O_RDONLY | O_CLOEXEC);
        if (oldroot < 0)
                return log_error_errno(-1, errno,
                                       "Failed to open old root for fchdir");
 
-       newroot = open(ROOTDIR, O_DIRECTORY | O_RDONLY);
+       newroot = open(ROOTDIR, O_DIRECTORY | O_RDONLY | O_CLOEXEC);
        if (newroot < 0)
                return log_error_errno(-1, errno,
                                       "Failed to open new root for fchdir");
diff --git a/src/lxcfs.c b/src/lxcfs.c
index b614f48..80a8b65 100644
--- a/src/lxcfs.c
+++ b/src/lxcfs.c
@@ -1035,7 +1035,7 @@ static int set_pidfile(char *pidfile)
                fl.l_len        = 0,
        };
 
-       fd = open(pidfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+       fd = open(pidfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | O_CLOEXEC);
        if (fd < 0)
                return log_error(-1, "Could not open pidfile %s: %m", pidfile);
 

From de69569b541fb7cb2f9bde65b88b444543dec0b8 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Fri, 13 Mar 2020 11:34:37 +0100
Subject: [PATCH 2/2] bindings: handle current working directory on upgrade

Recenly I've made failures to run the constructor or destructor fatal.
Mostly, because we can't guarantee correct functionality if they fail.
In fact we can't do anything useful at all (Maybe I can come up with
something more useful soon.)
In any case, this surfaced a bug where on systems that replace/delete
the current workding directory of lxcfs will cause the constructor to
crash on reload because the path that getcwd() returns does not exist
anymore. Fix this by always escaping to root after the construtor has
run but also make it optional in case someone is messing with chroot()s
or other things.

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/bindings.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/bindings.c b/src/bindings.c
index 4eadbe0..26ff9bf 100644
--- a/src/bindings.c
+++ b/src/bindings.c
@@ -717,11 +717,10 @@ static bool cgfs_setup_controllers(void)
 
 static void __attribute__((constructor)) lxcfs_init(void)
 {
-       __do_close_prot_errno int init_ns = -EBADF, pidfd = -EBADF;
+       __do_close_prot_errno int init_ns = -EBADF, root_fd = -EBADF,
+                                 pidfd = -EBADF;
        int i = 0;
        pid_t pid;
-       char *cret;
-       char cwd[MAXPATHLEN];
 
        lxcfs_info("Running constructor %s", __func__);
 
@@ -735,10 +734,6 @@ static void __attribute__((constructor)) lxcfs_init(void)
        if (init_ns < 0)
                log_exit("Failed to preserve initial mount namespace");
 
-       cret = getcwd(cwd, MAXPATHLEN);
-       if (!cret)
-               log_exit("%s - Could not retrieve current working directory", 
strerror(errno));
-
        /* This function calls unshare(CLONE_NEWNS) our initial mount namespace
         * to privately mount lxcfs cgroups. */
        if (!cgfs_setup_controllers())
@@ -747,9 +742,6 @@ static void __attribute__((constructor)) lxcfs_init(void)
        if (setns(init_ns, 0) < 0)
                log_exit("%s - Failed to switch back to initial mount 
namespace", strerror(errno));
 
-       if (!cret || chdir(cwd) < 0)
-               log_exit("%s - Could not change back to original working 
directory", strerror(errno));
-
        if (!init_cpuview())
                log_exit("Failed to init CPU view");
 
@@ -773,6 +765,15 @@ static void __attribute__((constructor)) lxcfs_init(void)
        lxcfs_info("api_extensions:");
        for (i = 0; i < nr_api_extensions; i++)
                lxcfs_info("- %s", api_extensions[i]);
+
+       root_fd = open("/", O_PATH | O_CLOEXEC);
+       if (root_fd < 0) {
+               lxcfs_error("%s - Failed to open root directory", 
strerror(errno));
+               return;
+       }
+
+       if (fchdir(root_fd) < 0)
+               lxcfs_error("%s - Failed to change to root directory", 
strerror(errno));
 }
 
 static void __attribute__((destructor)) lxcfs_exit(void)
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to