diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-25 08:22:27 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2024-01-19 12:02:09 +0100 |
commit | 63d3168d3fe2aa9dd51fba28e5e478e89d446d55 (patch) | |
tree | 025581e5f3612b68a5943681f51c17efb94c8b44 | |
parent | d98eb958ee345499c21ec99660fe3cce31b1342e (diff) | |
download | spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar.gz spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar.bz2 spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar.lz spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar.xz spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.tar.zst spectrum-63d3168d3fe2aa9dd51fba28e5e478e89d446d55.zip |
host: properly namespace vhost-user backends
Using a character that is not allowed in VM names to separate the VM name from the filesystem name means that there can't be conflicts between different VM/filesystem combinations. Signed-off-by: Alyssa Ross <hi@alyssa.is>
-rw-r--r-- | host/rootfs/etc/s6-rc/ext-rc-init/up | 8 | ||||
-rw-r--r-- | host/start-vmm/lib.rs | 17 | ||||
-rw-r--r-- | host/start-vmm/tests/vm_command-shared-dir.rs | 2 |
3 files changed, 21 insertions, 6 deletions
diff --git a/host/rootfs/etc/s6-rc/ext-rc-init/up b/host/rootfs/etc/s6-rc/ext-rc-init/up index 9fa003d..f92c1cd 100644 --- a/host/rootfs/etc/s6-rc/ext-rc-init/up +++ b/host/rootfs/etc/s6-rc/ext-rc-init/up @@ -24,10 +24,10 @@ if { elglob -0 paths ${dir}/shared-dirs/* forx -po0 -E path { $paths } backtick -E fsname { basename -- $path } - if { cp -R /etc/template/fs fs-${name}-${fsname} } - if { mkdir fs-${name}-${fsname}/data fs-${name}-${fsname}/env } - if { cp -P ${path}/dir fs-${name}-${fsname}/data/shared-dir } - touch vm-${name}/dependencies.d/fs-${name}-${fsname} + if { cp -R /etc/template/fs fs-${name}:${fsname} } + if { mkdir fs-${name}:${fsname}/data fs-${name}:${fsname}/env } + if { cp -P ${path}/dir fs-${name}:${fsname}/data/shared-dir } + touch vm-${name}/dependencies.d/fs-${name}:${fsname} } if { diff --git a/host/start-vmm/lib.rs b/host/start-vmm/lib.rs index 9c2b4b6..a9fb421 100644 --- a/host/start-vmm/lib.rs +++ b/host/start-vmm/lib.rs @@ -116,7 +116,7 @@ pub fn vm_config(vm_name: &str, config_root: &Path) -> Result<VmConfig, String> Ok(FsConfig { tag: entry.to_string(), - socket: format!("../fs-{vm_name}-{entry}/env/virtiofsd.sock"), + socket: format!("../fs-{vm_name}:{entry}/env/virtiofsd.sock"), }) }) .collect::<Result<_, String>>()?, @@ -207,6 +207,10 @@ pub fn create_vm(dir: &Path, config_root: &Path) -> Result<(), String> { return Err("not running from a VM service directory".to_string()); } + if vm_name.contains(':') { + return Err(format!("VM name may not contain a colon: {:?}", vm_name)); + } + let vm_name = &vm_name[3..]; let config = vm_config(vm_name, config_root)?; @@ -228,3 +232,14 @@ pub fn vm_command(api_socket_fd: RawFd) -> Result<Command, String> { Ok(command) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_vm_name_colon() { + let e = create_vm(Path::new("/vm-:"), Path::new("/")).unwrap_err(); + assert!(e.contains("colon"), "unexpected error: {:?}", e); + } +} diff --git a/host/start-vmm/tests/vm_command-shared-dir.rs b/host/start-vmm/tests/vm_command-shared-dir.rs index 89d5a76..ec9d1fa 100644 --- a/host/start-vmm/tests/vm_command-shared-dir.rs +++ b/host/start-vmm/tests/vm_command-shared-dir.rs @@ -41,7 +41,7 @@ fn main() -> std::io::Result<()> { assert_eq!(actual_tags, expected_tags); let expected_sockets = (1..=2) - .map(|i| format!("../fs-testvm-dir{i}/env/virtiofsd.sock")) + .map(|i| format!("../fs-testvm:dir{i}/env/virtiofsd.sock")) .collect(); assert_eq!(actual_sockets, expected_sockets); |