]> git.proxmox.com Git - mirror_lxc.git/commitdiff
Merge pull request #2171 from brauner/2018-02-16/rework_hooks
authorSerge Hallyn <serge@hallyn.com>
Sat, 17 Feb 2018 00:51:56 +0000 (18:51 -0600)
committerGitHub <noreply@github.com>
Sat, 17 Feb 2018 00:51:56 +0000 (18:51 -0600)
conf: fix run_script_argv()

src/lxc/conf.c
src/lxc/console.c
src/lxc/start.c

index f75d69656577e947f5b289599831d5a85ba03c11..e03a096c1d6b731f15f110c46b405c1b8547cfac 100644 (file)
@@ -354,10 +354,11 @@ static int run_buffer(char *buffer)
 
 int run_script_argv(const char *name, unsigned int hook_version,
                    const char *section, const char *script,
-                   const char *hookname, char **argsin)
+                   const char *hookname, char **argv)
 {
        int buf_pos, i, ret;
        char *buffer;
+       int fret = -1;
        size_t size = 0;
 
        if (hook_version == 0)
@@ -366,8 +367,8 @@ int run_script_argv(const char *name, unsigned int hook_version,
        else
                INFO("Executing script \"%s\" for container \"%s\"", script, name);
 
-       for (i = 0; argsin && argsin[i]; i++)
-               size += strlen(argsin[i]) + 1;
+       for (i = 0; argv && argv[i]; i++)
+               size += strlen(argv[i]) + 1;
 
        size += sizeof("exec");
        size += strlen(script);
@@ -376,8 +377,6 @@ int run_script_argv(const char *name, unsigned int hook_version,
        if (size > INT_MAX)
                return -EFBIG;
 
-       buffer = alloca(size);
-
        if (hook_version == 0) {
                size += strlen(hookname);
                size++;
@@ -390,24 +389,27 @@ int run_script_argv(const char *name, unsigned int hook_version,
 
                if (size > INT_MAX)
                        return -EFBIG;
+       }
+
+       buffer = malloc(size);
+       if (!buffer)
+               return -ENOMEM;
 
+       if (hook_version == 0)
                buf_pos = snprintf(buffer, size, "exec %s %s %s %s", script, name, section, hookname);
-               if (buf_pos < 0 || (size_t)buf_pos >= size) {
-                       ERROR("Failed to create command line for script \"%s\"", script);
-                       return -1;
-               }
-       } else {
+       else
                buf_pos = snprintf(buffer, size, "exec %s", script);
-               if (buf_pos < 0 || (size_t)buf_pos >= size) {
-                       ERROR("Failed to create command line for script \"%s\"", script);
-                       return -1;
-               }
+       if (buf_pos < 0 || (size_t)buf_pos >= size) {
+               ERROR("Failed to create command line for script \"%s\"", script);
+               goto on_error;
+       }
 
+       if (hook_version == 1) {
                ret = setenv("LXC_HOOK_TYPE", hookname, 1);
                if (ret < 0) {
                        SYSERROR("Failed to set environment variable: "
                                 "LXC_HOOK_TYPE=%s", hookname);
-                       return -1;
+                       goto on_error;
                }
                TRACE("Set environment variable: LXC_HOOK_TYPE=%s", hookname);
 
@@ -415,50 +417,50 @@ int run_script_argv(const char *name, unsigned int hook_version,
                if (ret < 0) {
                        SYSERROR("Failed to set environment variable: "
                                 "LXC_HOOK_SECTION=%s", section);
-                       return -1;
+                       goto on_error;
                }
                TRACE("Set environment variable: LXC_HOOK_SECTION=%s", section);
 
                if (strcmp(section, "net") == 0) {
                        char *parent;
 
-                       if (!argsin[0])
-                               return -EINVAL;
+                       if (!argv || !argv[0])
+                               goto on_error;
 
-                       ret = setenv("LXC_NET_TYPE", argsin[0], 1);
+                       ret = setenv("LXC_NET_TYPE", argv[0], 1);
                        if (ret < 0) {
                                SYSERROR("Failed to set environment variable: "
-                                        "LXC_NET_TYPE=%s", argsin[0]);
-                               return -1;
+                                        "LXC_NET_TYPE=%s", argv[0]);
+                               goto on_error;
                        }
-                       TRACE("Set environment variable: LXC_NET_TYPE=%s", argsin[0]);
+                       TRACE("Set environment variable: LXC_NET_TYPE=%s", argv[0]);
 
-                       parent = argsin[1] ? argsin[1] : "";
+                       parent = argv[1] ? argv[1] : "";
 
-                       if (strcmp(argsin[0], "macvlan")) {
+                       if (strcmp(argv[0], "macvlan")) {
                                ret = setenv("LXC_NET_PARENT", parent, 1);
                                if (ret < 0) {
                                        SYSERROR("Failed to set environment "
                                                 "variable: LXC_NET_PARENT=%s", parent);
-                                       return -1;
+                                       goto on_error;
                                }
                                TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
-                       } else if (strcmp(argsin[0], "phys")) {
+                       } else if (strcmp(argv[0], "phys")) {
                                ret = setenv("LXC_NET_PARENT", parent, 1);
                                if (ret < 0) {
                                        SYSERROR("Failed to set environment "
                                                 "variable: LXC_NET_PARENT=%s", parent);
-                                       return -1;
+                                       goto on_error;
                                }
                                TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
-                       } else if (strcmp(argsin[0], "veth")) {
-                               char *peer = argsin[2] ? argsin[2] : "";
+                       } else if (strcmp(argv[0], "veth")) {
+                               char *peer = argv[2] ? argv[2] : "";
 
                                ret = setenv("LXC_NET_PEER", peer, 1);
                                if (ret < 0) {
                                        SYSERROR("Failed to set environment "
                                                 "variable: LXC_NET_PEER=%s", peer);
-                                       return -1;
+                                       goto on_error;
                                }
                                TRACE("Set environment variable: LXC_NET_PEER=%s", peer);
 
@@ -466,25 +468,29 @@ int run_script_argv(const char *name, unsigned int hook_version,
                                if (ret < 0) {
                                        SYSERROR("Failed to set environment "
                                                 "variable: LXC_NET_PARENT=%s", parent);
-                                       return -1;
+                                       goto on_error;
                                }
                                TRACE("Set environment variable: LXC_NET_PARENT=%s", parent);
                        }
                }
        }
 
-       for (i = 0; argsin && argsin[i]; i++) {
+       for (i = 0; argv && argv[i]; i++) {
                size_t len = size - buf_pos;
 
-               ret = snprintf(buffer + buf_pos, len, " %s", argsin[i]);
+               ret = snprintf(buffer + buf_pos, len, " %s", argv[i]);
                if (ret < 0 || (size_t)ret >= len) {
                        ERROR("Failed to create command line for script \"%s\"", script);
-                       return -1;
+                       goto on_error;
                }
                buf_pos += ret;
        }
 
-       return run_buffer(buffer);
+       fret = run_buffer(buffer);
+
+on_error:
+       free(buffer);
+       return fret;
 }
 
 int run_script(const char *name, const char *section, const char *script, ...)
index a16466ba3e2394dcc4c5692cd5e1d04a94724b0d..9168cdf9d721a3b040705ad94d861e1426168e28 100644 (file)
@@ -215,16 +215,20 @@ int lxc_console_cb_con(int fd, uint32_t events, void *data,
        if (r <= 0) {
                INFO("Console client on fd %d has exited", fd);
                lxc_mainloop_del_handler(descr, fd);
-               if (fd == console->peer) {
+
+               if (fd == console->master) {
+                       console->master = -EBADF;
+               } else if (fd == console->peer) {
                        if (console->tty_state) {
                                lxc_console_signal_fini(console->tty_state);
                                console->tty_state = NULL;
                        }
-                       console->peer = -1;
-                       close(fd);
-                       return 0;
+                       console->peer = -EBADF;
+               } else {
+                       ERROR("Handler received unexpected file descriptor");
                }
                close(fd);
+
                return LXC_MAINLOOP_CLOSE;
        }
 
index b90d5ea00a063a1f435e15a2e4863e225efcf0fd..a64f6b64c47dfc3b51141200dd94bbff90e96f78 100644 (file)
@@ -628,7 +628,7 @@ void lxc_free_handler(struct lxc_handler *handler)
        lxc_put_nsfds(handler);
 
        if (handler->conf && handler->conf->reboot == 0)
-               if (handler->conf->maincmd_fd)
+               if (handler->conf->maincmd_fd >= 0)
                        close(handler->conf->maincmd_fd);
 
        if (handler->state_socket_pair[0] >= 0)