]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxccontainer: properly cleanup on mount injection failure
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 7 Jul 2019 16:00:27 +0000 (18:00 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 7 Jul 2019 16:24:55 +0000 (18:24 +0200)
Closes: #3082
Reported-by: Stéphane Graber <stgraber@ubuntu.com>
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/lxccontainer.c

index 57a7adeced730cd4281a60ca2673a9a2940f53d8..d8efdc41c673a737741fc35718ab6879a01e8957 100644 (file)
@@ -5117,33 +5117,37 @@ static int do_lxcapi_mount(struct lxc_container *c, const char *source,
 
                suff = strrchr(template, '/');
                if (!suff)
-                       _exit(EXIT_FAILURE);
+                       goto cleanup_target_in_child;
 
                ret = snprintf(path, sizeof(path), "%s%s", c->lxc_conf->shmount.path_cont, suff);
                if (ret < 0 || (size_t)ret >= sizeof(path)) {
                        SYSERROR("Error writing container mountpoint name");
-                       _exit(EXIT_FAILURE);
+                       goto cleanup_target_in_child;
                }
 
                ret = mount(path, target, NULL, MS_MOVE | MS_REC, NULL);
                if (ret < 0) {
                        SYSERROR("Failed to move the mount from \"%s\" to \"%s\"", path, target);
-                       _exit(EXIT_FAILURE);
+                       goto cleanup_target_in_child;
                }
                TRACE("Moved mount from \"%s\" to \"%s\"", path, target);
 
                _exit(EXIT_SUCCESS);
+
+       cleanup_target_in_child:
+               (void)remove(target);
+               _exit(EXIT_FAILURE);
        }
 
        ret = wait_for_pid(pid);
-       if (ret < 0) {
-               SYSERROR("Wait for the child with pid %ld failed", (long) pid);
-               goto out;
-       }
+       if (ret < 0)
+               SYSERROR("Wait for the child with pid %ld failed", (long)pid);
+       else
+               ret = 0;
 
-       ret = 0;
+       if (umount2(template, MNT_DETACH))
+               SYSWARN("Failed to remove temporary mount \"%s\"", template);
 
-       (void)umount2(template, MNT_DETACH);
        if (is_dir)
                (void)rmdir(template);
        else