vmm: validate virtio-fs tag length

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu 2024-04-04 16:27:23 +00:00 committed by Liu Wei
parent f09f5af16a
commit f3b0f59646
2 changed files with 13 additions and 2 deletions

View File

@ -271,17 +271,18 @@ impl VhostUserFrontendReqHandler for BackendReqHandler {
} }
} }
pub const VIRTIO_FS_TAG_LEN: usize = 36;
#[derive(Copy, Clone, Versionize)] #[derive(Copy, Clone, Versionize)]
#[repr(C, packed)] #[repr(C, packed)]
pub struct VirtioFsConfig { pub struct VirtioFsConfig {
pub tag: [u8; 36], pub tag: [u8; VIRTIO_FS_TAG_LEN],
pub num_request_queues: u32, pub num_request_queues: u32,
} }
impl Default for VirtioFsConfig { impl Default for VirtioFsConfig {
fn default() -> Self { fn default() -> Self {
VirtioFsConfig { VirtioFsConfig {
tag: [0; 36], tag: [0; VIRTIO_FS_TAG_LEN],
num_request_queues: 0, num_request_queues: 0,
} }
} }

View File

@ -24,6 +24,8 @@ const MAX_NUM_PCI_SEGMENTS: u16 = 96;
pub enum Error { pub enum Error {
/// Filesystem tag is missing /// Filesystem tag is missing
ParseFsTagMissing, ParseFsTagMissing,
/// Filesystem tag is too long
ParseFsTagTooLong,
/// Filesystem socket is missing /// Filesystem socket is missing
ParseFsSockMissing, ParseFsSockMissing,
/// Missing persistent memory file parameter. /// Missing persistent memory file parameter.
@ -355,6 +357,11 @@ impl fmt::Display for Error {
ParseFileSystem(o) => write!(f, "Error parsing --fs: {o}"), ParseFileSystem(o) => write!(f, "Error parsing --fs: {o}"),
ParseFsSockMissing => write!(f, "Error parsing --fs: socket missing"), ParseFsSockMissing => write!(f, "Error parsing --fs: socket missing"),
ParseFsTagMissing => write!(f, "Error parsing --fs: tag missing"), ParseFsTagMissing => write!(f, "Error parsing --fs: tag missing"),
ParseFsTagTooLong => write!(
f,
"Error parsing --fs: max tag length is {}",
virtio_devices::vhost_user::VIRTIO_FS_TAG_LEN
),
ParsePersistentMemory(o) => write!(f, "Error parsing --pmem: {o}"), ParsePersistentMemory(o) => write!(f, "Error parsing --pmem: {o}"),
ParsePmemFileMissing => write!(f, "Error parsing --pmem: file missing"), ParsePmemFileMissing => write!(f, "Error parsing --pmem: file missing"),
ParseVsock(o) => write!(f, "Error parsing --vsock: {o}"), ParseVsock(o) => write!(f, "Error parsing --vsock: {o}"),
@ -1519,6 +1526,9 @@ impl FsConfig {
parser.parse(fs).map_err(Error::ParseFileSystem)?; parser.parse(fs).map_err(Error::ParseFileSystem)?;
let tag = parser.get("tag").ok_or(Error::ParseFsTagMissing)?; let tag = parser.get("tag").ok_or(Error::ParseFsTagMissing)?;
if tag.len() > virtio_devices::vhost_user::VIRTIO_FS_TAG_LEN {
return Err(Error::ParseFsTagTooLong);
}
let socket = PathBuf::from(parser.get("socket").ok_or(Error::ParseFsSockMissing)?); let socket = PathBuf::from(parser.get("socket").ok_or(Error::ParseFsSockMissing)?);
let queue_size = parser let queue_size = parser