Skip to content

Commit 73f3996

Browse files
committed
install: Only switch to loopback after re-exec
I noticed we were leaking a loopback device, and the reason is because the "re-exec self for selinux" dance. We should really try to move that re-exec way earlier because it's a big hazard for stuff like this right now. This is a simple fix though that just moves the switch to allocating the loopback device until after we've done the install prep (including that re-exec). Signed-off-by: Colin Walters <[email protected]>
1 parent d2cfb22 commit 73f3996

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

lib/src/install.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,27 +1088,35 @@ pub(crate) async fn install_to_disk(opts: InstallToDiskOpts) -> Result<()> {
10881088
.device
10891089
.metadata()
10901090
.with_context(|| format!("Querying {}", &block_opts.device))?;
1091-
let mut loopback = None;
10921091
if opts.via_loopback {
10931092
if !target_blockdev_meta.file_type().is_file() {
10941093
anyhow::bail!(
10951094
"Not a regular file (to be used via loopback): {}",
10961095
block_opts.device
10971096
);
10981097
}
1099-
let loopback_dev = crate::blockdev::LoopbackDevice::new(block_opts.device.as_std_path())?;
1100-
block_opts.device = loopback_dev.path().into();
1101-
loopback = Some(loopback_dev);
11021098
} else if !target_blockdev_meta.file_type().is_block_device() {
11031099
anyhow::bail!("Not a block device: {}", block_opts.device);
11041100
}
11051101
let state = prepare_install(opts.config_opts, opts.source_opts, opts.target_opts).await?;
11061102

11071103
// This is all blocking stuff
1108-
let mut rootfs = {
1104+
let (mut rootfs, loopback) = {
1105+
let loopback_dev = if opts.via_loopback {
1106+
let loopback_dev =
1107+
crate::blockdev::LoopbackDevice::new(block_opts.device.as_std_path())?;
1108+
block_opts.device = loopback_dev.path().into();
1109+
Some(loopback_dev)
1110+
} else {
1111+
None
1112+
};
1113+
11091114
let state = state.clone();
1110-
tokio::task::spawn_blocking(move || baseline::install_create_rootfs(&state, block_opts))
1111-
.await??
1115+
let rootfs = tokio::task::spawn_blocking(move || {
1116+
baseline::install_create_rootfs(&state, block_opts)
1117+
})
1118+
.await??;
1119+
(rootfs, loopback_dev)
11121120
};
11131121

11141122
install_to_filesystem_impl(&state, &mut rootfs).await?;

0 commit comments

Comments
 (0)