diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-23 23:00:57 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2024-01-19 11:23:55 +0100 |
commit | b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2 (patch) | |
tree | 2c63143a60badd4d3ad931ddc7bf98f4800b9457 /host/start-vm | |
parent | 8fef1311d99d6a5026a3c548cf02cdc8cde0eec0 (diff) | |
download | spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.gz spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.bz2 spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.lz spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.xz spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.tar.zst spectrum-b1d64acff3fdbe7a0e819ecdd2d3b27620af08b2.zip |
host/rootfs: prefix VM service names
This will allow adding other services that are not specific to any particular VM (e.g. multi-VM bundles) without risking conflicts with user-provided VM names. Signed-off-by: Alyssa Ross <hi@alyssa.is>
Diffstat (limited to 'host/start-vm')
-rw-r--r-- | host/start-vm/ch.rs | 2 | ||||
-rw-r--r-- | host/start-vm/lib.rs | 21 | ||||
-rw-r--r-- | host/start-vm/tests/vm_command-basic.rs | 2 | ||||
-rw-r--r-- | host/start-vm/tests/vm_command-multiple-disks.rs | 2 | ||||
-rw-r--r-- | host/start-vm/tests/vm_command-shared-dir.rs | 4 |
5 files changed, 19 insertions, 12 deletions
diff --git a/host/start-vm/ch.rs b/host/start-vm/ch.rs index 84216fb..876a6ed 100644 --- a/host/start-vm/ch.rs +++ b/host/start-vm/ch.rs @@ -14,7 +14,7 @@ const EPERM: NonZeroI32 = unsafe { NonZeroI32::new_unchecked(1) }; const EPROTO: NonZeroI32 = unsafe { NonZeroI32::new_unchecked(71) }; fn command(vm_name: &OsStr, s: impl AsRef<OsStr>) -> Command { - let mut api_socket_path = OsString::from("/run/service/ext-"); + let mut api_socket_path = OsString::from("/run/service/ext-vm-"); api_socket_path.push(vm_name); api_socket_path.push("/env/cloud-hypervisor.sock"); diff --git a/host/start-vm/lib.rs b/host/start-vm/lib.rs index d9d7966..33c19bb 100644 --- a/host/start-vm/lib.rs +++ b/host/start-vm/lib.rs @@ -50,12 +50,19 @@ pub fn create_api_socket() -> Result<UnixListener, String> { pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> { let vm_name = dir .file_name() - .ok_or_else(|| "directory has no name".to_string())?; + .ok_or_else(|| "directory has no name".to_string())? + .as_bytes(); - if vm_name.as_bytes().contains(&b',') { + if !vm_name.starts_with(b"vm-") { + return Err("not running from a VM service directory".to_string()); + } + + if vm_name.contains(&b',') { return Err(format!("VM name may not contain a comma: {:?}", vm_name)); } + let vm_name = OsStr::from_bytes(&vm_name[3..]); + let config_dir = dir.join("data/config"); let mut command = Command::new("cloud-hypervisor"); @@ -130,9 +137,9 @@ pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> { if config_dir.join("wayland").exists() { command.arg("--gpu").arg({ - let mut gpu = OsString::from("socket=../"); + let mut gpu = OsString::from("socket=../gpu-"); gpu.push(vm_name); - gpu.push("-gpu/env/crosvm.sock"); + gpu.push("/env/crosvm.sock"); gpu }); } @@ -151,9 +158,9 @@ pub fn vm_command(dir: &Path, api_socket_fd: RawFd) -> Result<Command, String> { let mut arg = OsString::from("tag="); arg.push(&entry); - arg.push(",socket=../"); + arg.push(",socket=../fs-"); arg.push(vm_name); - arg.push("-fs-"); + arg.push("-"); arg.push(&entry); arg.push("/env/virtiofsd.sock"); command.arg(arg); @@ -179,7 +186,7 @@ mod tests { #[test] fn test_vm_name_comma() { - assert!(vm_command(Path::new("/v,m"), -1) + assert!(vm_command(Path::new("/vm-,"), -1) .unwrap_err() .contains("comma")); } diff --git a/host/start-vm/tests/vm_command-basic.rs b/host/start-vm/tests/vm_command-basic.rs index fac6a3d..92d78d8 100644 --- a/host/start-vm/tests/vm_command-basic.rs +++ b/host/start-vm/tests/vm_command-basic.rs @@ -10,7 +10,7 @@ use test_helper::TempDir; fn main() -> std::io::Result<()> { let tmp_dir = TempDir::new()?; - let service_dir = tmp_dir.path().join("testvm"); + let service_dir = tmp_dir.path().join("vm-testvm"); let kernel_path = service_dir.join("data/config/vmlinux"); let image_path = service_dir.join("data/config/blk/root.img"); diff --git a/host/start-vm/tests/vm_command-multiple-disks.rs b/host/start-vm/tests/vm_command-multiple-disks.rs index ad16f60..e17d505 100644 --- a/host/start-vm/tests/vm_command-multiple-disks.rs +++ b/host/start-vm/tests/vm_command-multiple-disks.rs @@ -12,7 +12,7 @@ use test_helper::TempDir; fn main() -> std::io::Result<()> { let tmp_dir = TempDir::new()?; - let service_dir = tmp_dir.path().join("testvm"); + let service_dir = tmp_dir.path().join("vm-testvm"); let vm_config = service_dir.join("data/config"); create_dir_all(&vm_config)?; diff --git a/host/start-vm/tests/vm_command-shared-dir.rs b/host/start-vm/tests/vm_command-shared-dir.rs index 3e8fe1f..d310d09 100644 --- a/host/start-vm/tests/vm_command-shared-dir.rs +++ b/host/start-vm/tests/vm_command-shared-dir.rs @@ -12,7 +12,7 @@ use test_helper::TempDir; fn main() -> std::io::Result<()> { let tmp_dir = TempDir::new()?; - let service_dir = tmp_dir.path().join("testvm"); + let service_dir = tmp_dir.path().join("vm-testvm"); let vm_config = service_dir.join("data/config"); create_dir_all(&vm_config)?; @@ -34,7 +34,7 @@ fn main() -> std::io::Result<()> { assert!(args.any(|arg| arg == "--fs")); let expected_fs_args = (1..=2) - .map(|i| format!("tag=dir{i},socket=../testvm-fs-dir{i}/env/virtiofsd.sock")) + .map(|i| format!("tag=dir{i},socket=../fs-testvm-dir{i}/env/virtiofsd.sock")) .map(OsString::from) .collect::<BTreeSet<_>>(); |