vmm: limit VSOCK CIDs to 32 bits

The VIRTIO specification[1] says:

> The upper 32 bits of the CID are reserved and zeroed.

We should therefore not allow the user to supply a VSOCK CID with
those bits set.  To accomplish this, limit the public API of the
virtio-vsock device to only accept 32-bit CIDs, while still using
64-bit CIDs internally since that's how virtio-vsock works.

[1]: https://docs.oasis-open.org/virtio/virtio/v1.2/csd01/virtio-v1.2-csd01.html#x1-4400004

Signed-off-by: Alyssa Ross <hi@alyssa.is>
This commit is contained in:
Alyssa Ross
2024-01-10 16:00:54 +01:00
committed by Rob Bradford
parent 7d0b85d727
commit 451d3fb2f0
5 changed files with 15 additions and 15 deletions

View File

@@ -156,7 +156,7 @@ pub enum ValidationError {
/// Need shared memory for vfio-user
UserDevicesRequireSharedMemory,
/// VSOCK Context Identifier has a special meaning, unsuitable for a VM.
VsockSpecialCid(u64),
VsockSpecialCid(u32),
/// Memory zone is reused across NUMA nodes
MemoryZoneReused(String, u32, u32),
/// Invalid number of PCI segments
@@ -2199,7 +2199,7 @@ impl VmConfig {
}
if let Some(vsock) = &self.vsock {
if [u32::MAX as u64, 0, 1, 2].contains(&vsock.cid) {
if [!0, 0, 1, 2].contains(&vsock.cid) {
return Err(ValidationError::VsockSpecialCid(vsock.cid));
}
}

View File

@@ -521,7 +521,7 @@ pub fn default_vdpaconfig_num_queues() -> usize {
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default)]
pub struct VsockConfig {
pub cid: u64,
pub cid: u32,
pub socket: PathBuf,
#[serde(default)]
pub iommu: bool,