summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-25 08:22:27 +0000
committerAlyssa Ross <hi@alyssa.is>2024-01-19 12:02:09 +0100
commit63d3168d3fe2aa9dd51fba28e5e478e89d446d55 (patch)
tree025581e5f3612b68a5943681f51c17efb94c8b44
parentd98eb958ee345499c21ec99660fe3cce31b1342e (diff)
downloadspectrum-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/up8
-rw-r--r--host/start-vmm/lib.rs17
-rw-r--r--host/start-vmm/tests/vm_command-shared-dir.rs2
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);