mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-27 12:37:35 +00:00
lxccontainer: properly cleanup on mount injection failure
Closes: #3082 Reported-by: Stéphane Graber <stgraber@ubuntu.com> Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
9c238bc6bf
commit
1f77c35ecb
@ -5117,33 +5117,37 @@ static int do_lxcapi_mount(struct lxc_container *c, const char *source,
|
|||||||
|
|
||||||
suff = strrchr(template, '/');
|
suff = strrchr(template, '/');
|
||||||
if (!suff)
|
if (!suff)
|
||||||
_exit(EXIT_FAILURE);
|
goto cleanup_target_in_child;
|
||||||
|
|
||||||
ret = snprintf(path, sizeof(path), "%s%s", c->lxc_conf->shmount.path_cont, suff);
|
ret = snprintf(path, sizeof(path), "%s%s", c->lxc_conf->shmount.path_cont, suff);
|
||||||
if (ret < 0 || (size_t)ret >= sizeof(path)) {
|
if (ret < 0 || (size_t)ret >= sizeof(path)) {
|
||||||
SYSERROR("Error writing container mountpoint name");
|
SYSERROR("Error writing container mountpoint name");
|
||||||
_exit(EXIT_FAILURE);
|
goto cleanup_target_in_child;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = mount(path, target, NULL, MS_MOVE | MS_REC, NULL);
|
ret = mount(path, target, NULL, MS_MOVE | MS_REC, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYSERROR("Failed to move the mount from \"%s\" to \"%s\"", path, target);
|
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);
|
TRACE("Moved mount from \"%s\" to \"%s\"", path, target);
|
||||||
|
|
||||||
_exit(EXIT_SUCCESS);
|
_exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
|
cleanup_target_in_child:
|
||||||
|
(void)remove(target);
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wait_for_pid(pid);
|
ret = wait_for_pid(pid);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
SYSERROR("Wait for the child with pid %ld failed", (long) pid);
|
SYSERROR("Wait for the child with pid %ld failed", (long)pid);
|
||||||
goto out;
|
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)
|
if (is_dir)
|
||||||
(void)rmdir(template);
|
(void)rmdir(template);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user