Skip to content

Commit

Permalink
lxccontainer: use thread-safe open() + write()
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Apr 29, 2018
1 parent d630991 commit 7cea590
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 30 deletions.
26 changes: 13 additions & 13 deletions src/lxc/cgroups/cgfsng.c
Expand Up @@ -622,7 +622,7 @@ static bool cg_legacy_filter_and_set_cpus(char *path, bool am_initialized)
*lastslash = oldv;
free(fpath);
fpath = must_make_path(path, "cpuset.cpus", NULL);
ret = lxc_write_to_file(fpath, cpulist, strlen(cpulist), false);
ret = lxc_write_to_file(fpath, cpulist, strlen(cpulist), false, 0666);
if (ret < 0) {
SYSERROR("Failed to write cpu list to \"%s\"", fpath);
goto on_error;
Expand Down Expand Up @@ -673,7 +673,7 @@ static bool copy_parent_file(char *path, char *file)

*lastslash = oldv;
fpath = must_make_path(path, file, NULL);
ret = lxc_write_to_file(fpath, value, len, false);
ret = lxc_write_to_file(fpath, value, len, false, 0666);
if (ret < 0)
SYSERROR("Failed to write \"%s\" to file \"%s\"", value, fpath);
free(fpath);
Expand Down Expand Up @@ -762,7 +762,7 @@ static bool cg_legacy_handle_cpuset_hierarchy(struct hierarchy *h, char *cgname)
}
free(cgpath);

ret = lxc_write_to_file(clonechildrenpath, "1", 1, false);
ret = lxc_write_to_file(clonechildrenpath, "1", 1, false, 0666);
if (ret < 0) {
/* Set clone_children so children inherit our settings */
SYSERROR("Failed to write 1 to \"%s\"", clonechildrenpath);
Expand Down Expand Up @@ -1712,7 +1712,7 @@ static bool cg_unified_create_cgroup(struct hierarchy *h, char *cgname)

cgroup = must_append_path(cgroup, parts[i], NULL);
target = must_make_path(cgroup, "cgroup.subtree_control", NULL);
ret = lxc_write_to_file(target, add_controllers, full_len, false);
ret = lxc_write_to_file(target, add_controllers, full_len, false, 0666);
free(target);
if (ret < 0) {
SYSERROR("Could not enable \"%s\" controllers in the "
Expand Down Expand Up @@ -1858,7 +1858,7 @@ static bool cgfsng_enter(void *hdata, pid_t pid)

fullpath = must_make_path(hierarchies[i]->fullcgpath,
"cgroup.procs", NULL);
ret = lxc_write_to_file(fullpath, pidstr, len, false);
ret = lxc_write_to_file(fullpath, pidstr, len, false, 0666);
if (ret != 0) {
SYSERROR("Failed to enter cgroup \"%s\"", fullpath);
free(fullpath);
Expand Down Expand Up @@ -2306,7 +2306,7 @@ static bool cgfsng_escape()
fullpath = must_make_path(hierarchies[i]->mountpoint,
hierarchies[i]->base_cgroup,
"cgroup.procs", NULL);
ret = lxc_write_to_file(fullpath, "0", 2, false);
ret = lxc_write_to_file(fullpath, "0", 2, false, 0666);
if (ret != 0) {
SYSERROR("Failed to escape to cgroup \"%s\"", fullpath);
free(fullpath);
Expand Down Expand Up @@ -2359,7 +2359,7 @@ static bool cgfsng_unfreeze(void *hdata)
return false;

fullpath = must_make_path(h->fullcgpath, "freezer.state", NULL);
ret = lxc_write_to_file(fullpath, THAWED, THAWED_LEN, false);
ret = lxc_write_to_file(fullpath, THAWED, THAWED_LEN, false, 0666);
free(fullpath);
if (ret < 0)
return false;
Expand Down Expand Up @@ -2417,7 +2417,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name,
base_path = must_make_path(h->mountpoint, container_cgroup, NULL);
full_path = must_make_path(base_path, "cgroup.procs", NULL);
/* cgroup is populated */
ret = lxc_write_to_file(full_path, pidstr, pidstr_len, false);
ret = lxc_write_to_file(full_path, pidstr, pidstr_len, false, 0666);
if (ret < 0 && errno != EBUSY)
goto on_error;

Expand All @@ -2443,7 +2443,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name,
goto on_error;

strcat(full_path, "/cgroup.procs");
ret = lxc_write_to_file(full_path, pidstr, len, false);
ret = lxc_write_to_file(full_path, pidstr, len, false, 0666);
if (ret == 0)
goto on_success;

Expand Down Expand Up @@ -2495,7 +2495,7 @@ static bool cgfsng_attach(const char *name, const char *lxcpath, pid_t pid)

fullpath = build_full_cgpath_from_monitorpath(h, path, "cgroup.procs");
free(path);
ret = lxc_write_to_file(fullpath, pidstr, len, false);
ret = lxc_write_to_file(fullpath, pidstr, len, false, 0666);
if (ret < 0) {
SYSERROR("Failed to attach %d to %s", (int)pid, fullpath);
free(fullpath);
Expand Down Expand Up @@ -2573,7 +2573,7 @@ static int cgfsng_set(const char *filename, const char *value, const char *name,
char *fullpath;

fullpath = build_full_cgpath_from_monitorpath(h, path, filename);
ret = lxc_write_to_file(fullpath, value, strlen(value), false);
ret = lxc_write_to_file(fullpath, value, strlen(value), false, 0666);
free(fullpath);
}
free(path);
Expand Down Expand Up @@ -2698,7 +2698,7 @@ static int cg_legacy_set_data(const char *filename, const char *value,
}

fullpath = must_make_path(h->fullcgpath, filename, NULL);
ret = lxc_write_to_file(fullpath, value, strlen(value), false);
ret = lxc_write_to_file(fullpath, value, strlen(value), false, 0666);
free(fullpath);
return ret;
}
Expand Down Expand Up @@ -2767,7 +2767,7 @@ static bool __cg_unified_setup_limits(void *hdata,
struct lxc_cgroup *cg = iterator->elem;

fullpath = must_make_path(h->fullcgpath, cg->subsystem, NULL);
ret = lxc_write_to_file(fullpath, cg->value, strlen(cg->value), false);
ret = lxc_write_to_file(fullpath, cg->value, strlen(cg->value), false, 0666);
free(fullpath);
if (ret < 0) {
SYSERROR("Failed to set \"%s\" to \"%s\"",
Expand Down
4 changes: 2 additions & 2 deletions src/lxc/conf.c
Expand Up @@ -2560,7 +2560,7 @@ int setup_sysctl_parameters(struct lxc_list *sysctls)
}

ret = lxc_write_to_file(filename, elem->value,
strlen(elem->value), false);
strlen(elem->value), false, 0666);
if (ret < 0) {
ERROR("Failed to setup sysctl parameters %s to %s",
elem->key, elem->value);
Expand Down Expand Up @@ -2595,7 +2595,7 @@ int setup_proc_filesystem(struct lxc_list *procs, pid_t pid)
}

ret = lxc_write_to_file(filename, elem->value,
strlen(elem->value), false);
strlen(elem->value), false, 0666);
if (ret < 0) {
ERROR("Failed to setup proc filesystem %s to %s",
elem->filename, elem->value);
Expand Down
27 changes: 15 additions & 12 deletions src/lxc/lxccontainer.c
Expand Up @@ -837,7 +837,6 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
struct lxc_handler *handler;
struct lxc_conf *conf;
bool daemonize = false;
FILE *pid_fp = NULL;
char *default_args[] = {
"/sbin/init",
NULL,
Expand Down Expand Up @@ -1001,30 +1000,34 @@ static bool do_lxcapi_start(struct lxc_container *c, int useinit, char * const a
* write the right PID.
*/
if (c->pidfile) {
pid_fp = fopen(c->pidfile, "w");
if (pid_fp == NULL) {
SYSERROR("Failed to create pidfile '%s' for '%s'",
c->pidfile, c->name);
int ret, w;
char pidstr[LXC_NUMSTRLEN64];

w = snprintf(pidstr, LXC_NUMSTRLEN64, "%d", (int)lxc_raw_getpid());
if (w < 0 || (size_t)w >= LXC_NUMSTRLEN64) {
free_init_cmd(init_cmd);
lxc_free_handler(handler);

SYSERROR("Failed to write monitor pid to \"%s\"", c->pidfile);

if (daemonize)
_exit(EXIT_FAILURE);

return false;
}

if (fprintf(pid_fp, "%d\n", lxc_raw_getpid()) < 0) {
SYSERROR("Failed to write '%s'", c->pidfile);
fclose(pid_fp);
pid_fp = NULL;
ret = lxc_write_to_file(c->pidfile, pidstr, w, false, 0600);
if (ret < 0) {
free_init_cmd(init_cmd);
lxc_free_handler(handler);

SYSERROR("Failed to write '%s'", c->pidfile);

if (daemonize)
_exit(EXIT_FAILURE);

return false;
}

fclose(pid_fp);
pid_fp = NULL;
}

conf->reboot = 0;
Expand Down
5 changes: 3 additions & 2 deletions src/lxc/utils.c
Expand Up @@ -971,12 +971,13 @@ size_t lxc_array_len(void **array)
return result;
}

int lxc_write_to_file(const char *filename, const void* buf, size_t count, bool add_newline)
int lxc_write_to_file(const char *filename, const void *buf, size_t count,
bool add_newline, mode_t mode)
{
int fd, saved_errno;
ssize_t ret;

fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0666);
fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode);
if (fd < 0)
return -1;
ret = lxc_write_nointr(fd, buf, count);
Expand Down
2 changes: 1 addition & 1 deletion src/lxc/utils.h
Expand Up @@ -392,7 +392,7 @@ extern int sha1sum_file(char *fnam, unsigned char *md_value);

/* read and write whole files */
extern int lxc_write_to_file(const char *filename, const void *buf,
size_t count, bool add_newline);
size_t count, bool add_newline, mode_t mode);
extern int lxc_read_from_file(const char *filename, void* buf, size_t count);

/* convert variadic argument lists to arrays (for execl type argument lists) */
Expand Down

0 comments on commit 7cea590

Please sign in to comment.