Skip to content

Commit 3b84f2a

Browse files
authored
Merge pull request #872 from Dstack-TEE/codex/fix-vmm-resize-validation
[STACKED on #859] fix(vmm): reject empty and zero ResizeVm updates
2 parents 9882a73 + 5459c26 commit 3b84f2a

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

dstack/vmm/src/main_service.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,29 @@ fn networks_from_vm_config(
397397
}
398398
}
399399

400+
fn validate_resize_request(request: &ResizeVmRequest) -> Result<()> {
401+
if request.vcpu.is_none()
402+
&& request.memory.is_none()
403+
&& request.disk_size.is_none()
404+
&& request.image.is_none()
405+
{
406+
bail!("resize request contains no updates");
407+
}
408+
if request.vcpu == Some(0) {
409+
bail!("vcpu must be greater than zero");
410+
}
411+
if request.memory == Some(0) {
412+
bail!("memory must be greater than zero");
413+
}
414+
if request.disk_size == Some(0) {
415+
bail!("disk_size must be greater than zero");
416+
}
417+
if request.image.as_deref() == Some("") {
418+
bail!("image must not be empty");
419+
}
420+
Ok(())
421+
}
422+
400423
impl RpcHandler {
401424
fn resolve_gpus(&self, gpu_cfg: &rpc::GpuConfig) -> Result<GpuConfig> {
402425
resolve_gpus_with_config(gpu_cfg, &self.app.config.cvm)
@@ -683,6 +706,7 @@ impl VmmRpc for RpcHandler {
683706
#[tracing::instrument(skip(self, request), fields(id = request.id))]
684707
async fn resize_vm(self, request: ResizeVmRequest) -> Result<()> {
685708
info!("Resizing VM: {:?}", request);
709+
validate_resize_request(&request)?;
686710
let vm_work_dir = self.app.work_dir(&request.id);
687711
let mut manifest = vm_work_dir.manifest().context("failed to read manifest")?;
688712
self.apply_resource_updates(
@@ -1005,6 +1029,30 @@ mod tests {
10051029
assert!(manifest.networks.is_empty());
10061030
}
10071031

1032+
#[test]
1033+
fn resize_request_rejects_empty_zero_and_empty_image_updates() {
1034+
let mut request = ResizeVmRequest {
1035+
id: "vm-1".into(),
1036+
..Default::default()
1037+
};
1038+
assert!(validate_resize_request(&request).is_err());
1039+
1040+
request.vcpu = Some(0);
1041+
assert!(validate_resize_request(&request).is_err());
1042+
request.vcpu = Some(1);
1043+
assert!(validate_resize_request(&request).is_ok());
1044+
1045+
request.vcpu = None;
1046+
request.memory = Some(0);
1047+
assert!(validate_resize_request(&request).is_err());
1048+
request.memory = None;
1049+
request.disk_size = Some(0);
1050+
assert!(validate_resize_request(&request).is_err());
1051+
request.disk_size = None;
1052+
request.image = Some(String::new());
1053+
assert!(validate_resize_request(&request).is_err());
1054+
}
1055+
10081056
#[test]
10091057
fn simulated_tee_is_selected_per_instance_and_implies_no_tee() {
10101058
let mut request = test_vm_configuration();

0 commit comments

Comments
 (0)