]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
coverity: #1425874 + cleanup
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 9 Dec 2017 18:12:48 +0000 (19:12 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 17 Dec 2017 15:32:13 +0000 (16:32 +0100)
- check for memory allocation failure
- free allocated memory
- cleanup function

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/lxccontainer.c

index 84dc3aba1ce9201be824abee76ab8595d96b6ebb..b45f996435120781f2115ba9467a81441e12f493 100644 (file)
@@ -3950,22 +3950,27 @@ static bool do_lxcapi_may_control(struct lxc_container *c)
 WRAP_API(bool, lxcapi_may_control)
 
 static bool do_add_remove_node(pid_t init_pid, const char *path, bool add,
-               struct stat *st)
+                              struct stat *st)
 {
+       int ret;
+       char *tmp;
+       pid_t pid;
        char chrootpath[MAXPATHLEN];
        char *directory_path = NULL;
-       pid_t pid;
-       int ret;
 
-       if ((pid = fork()) < 0) {
-               SYSERROR("failed to fork a child helper");
+       pid = fork();
+       if (pid < 0) {
+               SYSERROR("Failed to fork()");
                return false;
        }
+
        if (pid) {
-               if (wait_for_pid(pid) != 0) {
-                       ERROR("Failed to create note in guest");
+               ret = wait_for_pid(pid);
+               if (ret != 0) {
+                       ERROR("Failed to create device node");
                        return false;
                }
+
                return true;
        }
 
@@ -3974,34 +3979,44 @@ static bool do_add_remove_node(pid_t init_pid, const char *path, bool add,
        if (ret < 0 || ret >= MAXPATHLEN)
                return false;
 
-       if (chroot(chrootpath) < 0)
-               exit(1);
-       if (chdir("/") < 0)
-               exit(1);
+       ret = chroot(chrootpath);
+       if (ret < 0)
+               exit(EXIT_FAILURE);
+
+       ret = chdir("/");
+       if (ret < 0)
+               exit(EXIT_FAILURE);
+
        /* remove path if it exists */
-       if(faccessat(AT_FDCWD, path, F_OK, AT_SYMLINK_NOFOLLOW) == 0) {
-               if (unlink(path) < 0) {
-                       ERROR("unlink failed");
-                       exit(1);
-               }
+       ret = faccessat(AT_FDCWD, path, F_OK, AT_SYMLINK_NOFOLLOW);
+       if(ret == 0) {
+               ret = unlink(path);
+               if (ret < 0)
+                       exit(EXIT_FAILURE);
        }
+
        if (!add)
-               exit(0);
+               exit(EXIT_SUCCESS);
 
        /* create any missing directories */
-       directory_path = dirname(strdup(path));
-       if (mkdir_p(directory_path, 0755) < 0 && errno != EEXIST) {
-               ERROR("failed to create directory");
-               exit(1);
+       tmp = strdup(path);
+       if (!tmp)
+               exit(EXIT_FAILURE);
+
+       directory_path = dirname(tmp);
+       ret = mkdir_p(directory_path, 0755);
+       if (ret < 0 && errno != EEXIST) {
+               free(tmp);
+               exit(EXIT_FAILURE);
        }
 
        /* create the device node */
-       if (mknod(path, st->st_mode, st->st_rdev) < 0) {
-               ERROR("mknod failed");
-               exit(1);
-       }
+       ret = mknod(path, st->st_mode, st->st_rdev);
+       free(tmp);
+       if (ret < 0)
+               exit(EXIT_FAILURE);
 
-       exit(0);
+       exit(EXIT_SUCCESS);
 }
 
 static bool add_remove_device_node(struct lxc_container *c, const char *src_path, const char *dest_path, bool add)