{
int buf_pos, i, ret;
char *buffer;
+ int fret = -1;
size_t size = 0;
if (hook_version == 0)
return -EFBIG;
}
- buffer = alloca(size);
+ 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);
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;
+ goto on_error;
}
if (hook_version == 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);
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);
char *parent;
if (!argsin[0])
- return -EINVAL;
+ goto on_error;
ret = setenv("LXC_NET_TYPE", argsin[0], 1);
if (ret < 0) {
SYSERROR("Failed to set environment variable: "
"LXC_NET_TYPE=%s", argsin[0]);
- return -1;
+ goto on_error;
}
TRACE("Set environment variable: LXC_NET_TYPE=%s", argsin[0]);
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")) {
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")) {
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);
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);
}
ret = snprintf(buffer + buf_pos, len, " %s", argsin[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, ...)