Skip to content

Commit

Permalink
Merge pull request #2171 from brauner/2018-02-16/rework_hooks
Browse files Browse the repository at this point in the history
conf: fix run_script_argv()
  • Loading branch information
hallyn committed Feb 17, 2018
2 parents 941138e + c06a055 commit 3d7868a
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 40 deletions.
76 changes: 41 additions & 35 deletions src/lxc/conf.c
Expand Up @@ -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)
Expand All @@ -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);
Expand All @@ -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++;
Expand All @@ -390,101 +389,108 @@ 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);

ret = setenv("LXC_HOOK_SECTION", section, 1);
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);

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);
}
}
}

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, ...)
Expand Down
12 changes: 8 additions & 4 deletions src/lxc/console.c
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion src/lxc/start.c
Expand Up @@ -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)
Expand Down

0 comments on commit 3d7868a

Please sign in to comment.