Unverified Commit ff620677 by Stéphane Graber Committed by GitHub

Merge pull request #2297 from brauner/2018-04-29/bugfixes

coverity
parents ad38dca1 e62fd16f
...@@ -622,7 +622,7 @@ copy_parent: ...@@ -622,7 +622,7 @@ copy_parent:
*lastslash = oldv; *lastslash = oldv;
free(fpath); free(fpath);
fpath = must_make_path(path, "cpuset.cpus", NULL); 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) { if (ret < 0) {
SYSERROR("Failed to write cpu list to \"%s\"", fpath); SYSERROR("Failed to write cpu list to \"%s\"", fpath);
goto on_error; goto on_error;
...@@ -673,7 +673,7 @@ static bool copy_parent_file(char *path, char *file) ...@@ -673,7 +673,7 @@ static bool copy_parent_file(char *path, char *file)
*lastslash = oldv; *lastslash = oldv;
fpath = must_make_path(path, file, NULL); 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) if (ret < 0)
SYSERROR("Failed to write \"%s\" to file \"%s\"", value, fpath); SYSERROR("Failed to write \"%s\" to file \"%s\"", value, fpath);
free(fpath); free(fpath);
...@@ -762,7 +762,7 @@ static bool cg_legacy_handle_cpuset_hierarchy(struct hierarchy *h, char *cgname) ...@@ -762,7 +762,7 @@ static bool cg_legacy_handle_cpuset_hierarchy(struct hierarchy *h, char *cgname)
} }
free(cgpath); free(cgpath);
ret = lxc_write_to_file(clonechildrenpath, "1", 1, false); ret = lxc_write_to_file(clonechildrenpath, "1", 1, false, 0666);
if (ret < 0) { if (ret < 0) {
/* Set clone_children so children inherit our settings */ /* Set clone_children so children inherit our settings */
SYSERROR("Failed to write 1 to \"%s\"", clonechildrenpath); SYSERROR("Failed to write 1 to \"%s\"", clonechildrenpath);
...@@ -1712,7 +1712,7 @@ static bool cg_unified_create_cgroup(struct hierarchy *h, char *cgname) ...@@ -1712,7 +1712,7 @@ static bool cg_unified_create_cgroup(struct hierarchy *h, char *cgname)
cgroup = must_append_path(cgroup, parts[i], NULL); cgroup = must_append_path(cgroup, parts[i], NULL);
target = must_make_path(cgroup, "cgroup.subtree_control", 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); free(target);
if (ret < 0) { if (ret < 0) {
SYSERROR("Could not enable \"%s\" controllers in the " SYSERROR("Could not enable \"%s\" controllers in the "
...@@ -1858,7 +1858,7 @@ static bool cgfsng_enter(void *hdata, pid_t pid) ...@@ -1858,7 +1858,7 @@ static bool cgfsng_enter(void *hdata, pid_t pid)
fullpath = must_make_path(hierarchies[i]->fullcgpath, fullpath = must_make_path(hierarchies[i]->fullcgpath,
"cgroup.procs", NULL); "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) { if (ret != 0) {
SYSERROR("Failed to enter cgroup \"%s\"", fullpath); SYSERROR("Failed to enter cgroup \"%s\"", fullpath);
free(fullpath); free(fullpath);
...@@ -2027,7 +2027,8 @@ static int cg_legacy_mount_controllers(int type, struct hierarchy *h, ...@@ -2027,7 +2027,8 @@ static int cg_legacy_mount_controllers(int type, struct hierarchy *h,
controllerpath, controllerpath,
flags | MS_REMOUNT); flags | MS_REMOUNT);
ret = mount(controllerpath, controllerpath, "cgroup", ret = mount(controllerpath, controllerpath, "cgroup",
MS_REMOUNT | MS_BIND | MS_RDONLY, NULL); remount_flags | MS_REMOUNT | MS_BIND | MS_RDONLY,
NULL);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to remount \"%s\" ro", controllerpath); SYSERROR("Failed to remount \"%s\" ro", controllerpath);
return -1; return -1;
...@@ -2305,7 +2306,7 @@ static bool cgfsng_escape() ...@@ -2305,7 +2306,7 @@ static bool cgfsng_escape()
fullpath = must_make_path(hierarchies[i]->mountpoint, fullpath = must_make_path(hierarchies[i]->mountpoint,
hierarchies[i]->base_cgroup, hierarchies[i]->base_cgroup,
"cgroup.procs", NULL); "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) { if (ret != 0) {
SYSERROR("Failed to escape to cgroup \"%s\"", fullpath); SYSERROR("Failed to escape to cgroup \"%s\"", fullpath);
free(fullpath); free(fullpath);
...@@ -2358,7 +2359,7 @@ static bool cgfsng_unfreeze(void *hdata) ...@@ -2358,7 +2359,7 @@ static bool cgfsng_unfreeze(void *hdata)
return false; return false;
fullpath = must_make_path(h->fullcgpath, "freezer.state", NULL); 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); free(fullpath);
if (ret < 0) if (ret < 0)
return false; return false;
...@@ -2416,7 +2417,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name, ...@@ -2416,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); base_path = must_make_path(h->mountpoint, container_cgroup, NULL);
full_path = must_make_path(base_path, "cgroup.procs", NULL); full_path = must_make_path(base_path, "cgroup.procs", NULL);
/* cgroup is populated */ /* 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) if (ret < 0 && errno != EBUSY)
goto on_error; goto on_error;
...@@ -2442,7 +2443,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name, ...@@ -2442,7 +2443,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name,
goto on_error; goto on_error;
strcat(full_path, "/cgroup.procs"); 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) if (ret == 0)
goto on_success; goto on_success;
...@@ -2494,7 +2495,7 @@ static bool cgfsng_attach(const char *name, const char *lxcpath, pid_t pid) ...@@ -2494,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"); fullpath = build_full_cgpath_from_monitorpath(h, path, "cgroup.procs");
free(path); free(path);
ret = lxc_write_to_file(fullpath, pidstr, len, false); ret = lxc_write_to_file(fullpath, pidstr, len, false, 0666);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to attach %d to %s", (int)pid, fullpath); SYSERROR("Failed to attach %d to %s", (int)pid, fullpath);
free(fullpath); free(fullpath);
...@@ -2572,7 +2573,7 @@ static int cgfsng_set(const char *filename, const char *value, const char *name, ...@@ -2572,7 +2573,7 @@ static int cgfsng_set(const char *filename, const char *value, const char *name,
char *fullpath; char *fullpath;
fullpath = build_full_cgpath_from_monitorpath(h, path, filename); 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(fullpath);
} }
free(path); free(path);
...@@ -2697,7 +2698,7 @@ static int cg_legacy_set_data(const char *filename, const char *value, ...@@ -2697,7 +2698,7 @@ static int cg_legacy_set_data(const char *filename, const char *value,
} }
fullpath = must_make_path(h->fullcgpath, filename, NULL); 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); free(fullpath);
return ret; return ret;
} }
...@@ -2766,7 +2767,7 @@ static bool __cg_unified_setup_limits(void *hdata, ...@@ -2766,7 +2767,7 @@ static bool __cg_unified_setup_limits(void *hdata,
struct lxc_cgroup *cg = iterator->elem; struct lxc_cgroup *cg = iterator->elem;
fullpath = must_make_path(h->fullcgpath, cg->subsystem, NULL); 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); free(fullpath);
if (ret < 0) { if (ret < 0) {
SYSERROR("Failed to set \"%s\" to \"%s\"", SYSERROR("Failed to set \"%s\" to \"%s\"",
......
...@@ -562,10 +562,6 @@ int pin_rootfs(const char *rootfs) ...@@ -562,10 +562,6 @@ int pin_rootfs(const char *rootfs)
if (!realpath(rootfs, absrootfs)) if (!realpath(rootfs, absrootfs))
return -2; return -2;
ret = access(absrootfs, F_OK);
if (ret != 0)
return -1;
ret = stat(absrootfs, &s); ret = stat(absrootfs, &s);
if (ret < 0) if (ret < 0)
return -1; return -1;
...@@ -581,12 +577,12 @@ int pin_rootfs(const char *rootfs) ...@@ -581,12 +577,12 @@ int pin_rootfs(const char *rootfs)
if (fd < 0) if (fd < 0)
return fd; return fd;
if (fstatfs (fd, &sfs)) { ret = fstatfs (fd, &sfs);
return -1; if (ret < 0)
} return fd;
if (sfs.f_type == NFS_SUPER_MAGIC) { if (sfs.f_type == NFS_SUPER_MAGIC) {
DEBUG("rootfs on NFS, not unlinking pin file \"%s\".", absrootfspin); DEBUG("Rootfs on NFS, not unlinking pin file \"%s\"", absrootfspin);
return fd; return fd;
} }
...@@ -2564,7 +2560,7 @@ int setup_sysctl_parameters(struct lxc_list *sysctls) ...@@ -2564,7 +2560,7 @@ int setup_sysctl_parameters(struct lxc_list *sysctls)
} }
ret = lxc_write_to_file(filename, elem->value, ret = lxc_write_to_file(filename, elem->value,
strlen(elem->value), false); strlen(elem->value), false, 0666);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to setup sysctl parameters %s to %s", ERROR("Failed to setup sysctl parameters %s to %s",
elem->key, elem->value); elem->key, elem->value);
...@@ -2599,7 +2595,7 @@ int setup_proc_filesystem(struct lxc_list *procs, pid_t pid) ...@@ -2599,7 +2595,7 @@ int setup_proc_filesystem(struct lxc_list *procs, pid_t pid)
} }
ret = lxc_write_to_file(filename, elem->value, ret = lxc_write_to_file(filename, elem->value,
strlen(elem->value), false); strlen(elem->value), false, 0666);
if (ret < 0) { if (ret < 0) {
ERROR("Failed to setup proc filesystem %s to %s", ERROR("Failed to setup proc filesystem %s to %s",
elem->filename, elem->value); elem->filename, elem->value);
......
...@@ -19,13 +19,14 @@ ...@@ -19,13 +19,14 @@
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <malloc.h>
#include <stdio.h>
#include <errno.h> #include <errno.h>
#include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h> #include <malloc.h>
#include <pthread.h> #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <unistd.h>
#include <lxc/lxccontainer.h> #include <lxc/lxccontainer.h>
......
...@@ -83,8 +83,10 @@ int lxc_file_for_each_line_mmap(const char *file, lxc_file_cb callback, ...@@ -83,8 +83,10 @@ int lxc_file_for_each_line_mmap(const char *file, lxc_file_cb callback,
return -1; return -1;
} }
if (st.st_size == 0) if (st.st_size == 0) {
close(fd);
return 0; return 0;
}
buf = lxc_strmmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); buf = lxc_strmmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
if (buf == MAP_FAILED) { if (buf == MAP_FAILED) {
......
...@@ -667,33 +667,23 @@ void lxc_terminal_free(struct lxc_conf *conf, int fd) ...@@ -667,33 +667,23 @@ void lxc_terminal_free(struct lxc_conf *conf, int fd)
static int lxc_terminal_peer_default(struct lxc_terminal *terminal) static int lxc_terminal_peer_default(struct lxc_terminal *terminal)
{ {
struct lxc_terminal_state *ts; struct lxc_terminal_state *ts;
const char *path = terminal->path; const char *path;
int fd;
int ret = 0; int ret = 0;
if (!path) { if (terminal->path)
ret = access("/dev/tty", F_OK); path = terminal->path;
if (ret == 0) { else
/* If no terminal was given, try current controlling path = "/dev/tty";
* terminal, there won't be one if we were started as a
* daemon (-d).
*/
fd = open("/dev/tty", O_RDWR);
if (fd >= 0) {
close(fd);
path = "/dev/tty";
}
}
}
if (!path) {
errno = ENOTTY;
DEBUG("The process does not have a controlling terminal");
goto on_succes;
}
terminal->peer = lxc_unpriv(open(path, O_RDWR | O_CLOEXEC)); terminal->peer = lxc_unpriv(open(path, O_RDWR | O_CLOEXEC));
if (terminal->peer < 0) { if (terminal->peer < 0) {
if (!terminal->path) {
errno = ENODEV;
DEBUG("%s - The process does not have a controlling "
"terminal", strerror(errno));
goto on_succes;
}
ERROR("%s - Failed to open proxy terminal \"%s\"", ERROR("%s - Failed to open proxy terminal \"%s\"",
strerror(errno), path); strerror(errno), path);
return -ENOTTY; return -ENOTTY;
......
...@@ -109,7 +109,7 @@ static void create_helpfn(const struct lxc_arguments *args) ...@@ -109,7 +109,7 @@ static void create_helpfn(const struct lxc_arguments *args)
pid = fork(); pid = fork();
if (pid) { if (pid) {
wait_for_pid(pid); (void)wait_for_pid(pid);
return; return;
} }
......
...@@ -337,7 +337,6 @@ static int lxc_monitor_open(const char *lxcpath) ...@@ -337,7 +337,6 @@ static int lxc_monitor_open(const char *lxcpath)
int fd; int fd;
size_t retry; size_t retry;
size_t len; size_t len;
int ret = -1;
int backoff_ms[] = {10, 50, 100}; int backoff_ms[] = {10, 50, 100};
if (lxc_monitor_sock_name(lxcpath, &addr) < 0) if (lxc_monitor_sock_name(lxcpath, &addr) < 0)
...@@ -352,9 +351,9 @@ static int lxc_monitor_open(const char *lxcpath) ...@@ -352,9 +351,9 @@ static int lxc_monitor_open(const char *lxcpath)
len = strlen(&addr.sun_path[1]); len = strlen(&addr.sun_path[1]);
if (len >= sizeof(addr.sun_path) - 1) { if (len >= sizeof(addr.sun_path) - 1) {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
ret = -errno; close(fd);
fprintf(stderr, "name of monitor socket too long (%zu bytes): %s\n", len, strerror(errno)); fprintf(stderr, "name of monitor socket too long (%zu bytes): %s\n", len, strerror(errno));
goto on_error; return -errno;
} }
for (retry = 0; retry < sizeof(backoff_ms) / sizeof(backoff_ms[0]); retry++) { for (retry = 0; retry < sizeof(backoff_ms) / sizeof(backoff_ms[0]); retry++) {
...@@ -366,16 +365,11 @@ static int lxc_monitor_open(const char *lxcpath) ...@@ -366,16 +365,11 @@ static int lxc_monitor_open(const char *lxcpath)
} }
if (fd < 0) { if (fd < 0) {
ret = -errno;
fprintf(stderr, "Failed to connect to monitor socket: %s\n", strerror(errno)); fprintf(stderr, "Failed to connect to monitor socket: %s\n", strerror(errno));
goto on_error; return -errno;
} }
return fd; return fd;
on_error:
close(fd);
return ret;
} }
static int lxc_monitor_read_fdset(struct pollfd *fds, nfds_t nfds, static int lxc_monitor_read_fdset(struct pollfd *fds, nfds_t nfds,
......
...@@ -1093,9 +1093,6 @@ int rm_r(char *dirname) ...@@ -1093,9 +1093,6 @@ int rm_r(char *dirname)
char *pathname; char *pathname;
struct stat mystat; struct stat mystat;
if (!direntp)
break;
if (!strcmp(direntp->d_name, ".") || if (!strcmp(direntp->d_name, ".") ||
!strcmp(direntp->d_name, "..")) !strcmp(direntp->d_name, ".."))
continue; continue;
......
...@@ -971,12 +971,13 @@ size_t lxc_array_len(void **array) ...@@ -971,12 +971,13 @@ size_t lxc_array_len(void **array)
return result; 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; int fd, saved_errno;
ssize_t ret; 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) if (fd < 0)
return -1; return -1;
ret = lxc_write_nointr(fd, buf, count); ret = lxc_write_nointr(fd, buf, count);
......
...@@ -392,7 +392,7 @@ extern int sha1sum_file(char *fnam, unsigned char *md_value); ...@@ -392,7 +392,7 @@ extern int sha1sum_file(char *fnam, unsigned char *md_value);
/* read and write whole files */ /* read and write whole files */
extern int lxc_write_to_file(const char *filename, const void *buf, 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); 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) */ /* convert variadic argument lists to arrays (for execl type argument lists) */
......
...@@ -94,7 +94,7 @@ static int do_test_file_open(struct lxc_container *c, char *fnam) ...@@ -94,7 +94,7 @@ static int do_test_file_open(struct lxc_container *c, char *fnam)
fret = 0; fret = 0;
err2: err2:
wait_for_pid(pid); (void)wait_for_pid(pid);
err1: err1:
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
......
...@@ -124,7 +124,7 @@ static int test_attach_lsm_func(struct lxc_container *ct) ...@@ -124,7 +124,7 @@ static int test_attach_lsm_func(struct lxc_container *ct)
ret = 0; ret = 0;
err2: err2:
wait_for_pid(pid); (void)wait_for_pid(pid);
err1: err1:
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
...@@ -178,7 +178,7 @@ static int test_attach_lsm_cmd(struct lxc_container *ct) ...@@ -178,7 +178,7 @@ static int test_attach_lsm_cmd(struct lxc_container *ct)
ret = 0; ret = 0;
err2: err2:
wait_for_pid(pid); (void)wait_for_pid(pid);
err1: err1:
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
...@@ -240,7 +240,7 @@ static int test_attach_func(struct lxc_container *ct) ...@@ -240,7 +240,7 @@ static int test_attach_func(struct lxc_container *ct)
ret = 0; ret = 0;
err2: err2:
wait_for_pid(pid); (void)wait_for_pid(pid);
err1: err1:
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment