]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
fix logic for execute log file
authorTycho Andersen <tycho@tycho.ws>
Thu, 3 May 2018 18:32:19 +0000 (18:32 +0000)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 23 Aug 2018 21:00:42 +0000 (23:00 +0200)
The problem here is that lxc-init runs *inside* the container. So if a
person has the log file set to /home/$USER/foo, lxc-init ends up making a
directory /home/$USER/foo inside the container to put the log file in. What
we really want are the logs to be propagated from inside the container to
the outside. We accomplish this by passing an fd without O_CLOEXEC, and
telling lxc-init to log to that file.

Signed-off-by: Tycho Andersen <tycho@tycho.ws>
src/lxc/execute.c

index 3e0a99e06f5a823dcf098b78e76adb912bdbe78b..b4f88e235aecfe2029c33ef2a294cffa5c3bb0f1 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#define _GNU_SOURCE
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <stdio.h>
 
 #include "conf.h"
 #include "log.h"
@@ -41,9 +43,9 @@ struct execute_args {
 
 static int execute_start(struct lxc_handler *handler, void* data)
 {
-       int j, i = 0;
+       int j, i = 0, log = -1;
        struct execute_args *my_args = data;
-       char **argv;
+       char **argv, *logfd;
        int argc = 0, argc_add;
        char *initpath;
 
@@ -79,9 +81,25 @@ static int execute_start(struct lxc_handler *handler, void* data)
                    (char *)lxc_log_priority_to_string(lxc_log_get_level());
        }
 
-       if (handler->conf->logfile) {
+       if (current_config->logfd != -1 || lxc_log_fd != -1) {
+               int to_dup = current_config->logfd;
+
+               if (current_config->logfd == -1)
+                       to_dup = lxc_log_fd;
+
+               log = dup(to_dup);
+               if (log < 0) {
+                       SYSERROR("dup of log fd failed");
+                       goto out2;
+               }
+
+               if (asprintf(&logfd, "/proc/1/fd/%d", log) < 0) {
+                       ERROR("Couldn't allocate memory for log string");
+                       goto out3;
+               }
+
                argv[i++] = "-o";
-               argv[i++] = (char *)handler->conf->logfile;
+               argv[i++] = logfd;
        }
 
        if (my_args->quiet)
@@ -102,6 +120,10 @@ static int execute_start(struct lxc_handler *handler, void* data)
        execvp(argv[0], argv);
        SYSERROR("Failed to exec %s", argv[0]);
        free(initpath);
+
+       free(logfd);
+out3:
+       close(log);
 out2:
        free(argv);
 out1: