diff --git a/hypervisor/debug/shell.c b/hypervisor/debug/shell.c index 09ed94c16..d45639f43 100644 --- a/hypervisor/debug/shell.c +++ b/hypervisor/debug/shell.c @@ -238,6 +238,22 @@ static void shell_puts(const char *string_ptr) SHELL_STRING_MAX_LEN)); } +static uint16_t sanitize_vmid(uint16_t vmid) +{ + uint16_t sanitized_vmid = vmid; + char temp_str[TEMP_STR_SIZE]; + + if (vmid >= CONFIG_MAX_VM_NUM) { + snprintf(temp_str, MAX_STR_SIZE, + "VM ID given exceeds the MAX_VM_NUM(%u), using 0 instead\r\n", + CONFIG_MAX_VM_NUM); + shell_puts(temp_str); + sanitized_vmid = 0U; + } + + return sanitized_vmid; +} + static void shell_handle_special_char(char ch) { switch (ch) { @@ -734,7 +750,7 @@ static int32_t shell_vcpu_dumpreg(int32_t argc, char **argv) if (status < 0) { goto out; } - vm_id = (uint16_t)status; + vm_id = sanitize_vmid((uint16_t)status); vcpu_id = (uint16_t)strtol_deci(argv[2]); vm = get_vm_from_vmid(vm_id); @@ -829,7 +845,7 @@ static int32_t shell_to_sos_console(__unused int32_t argc, __unused char **argv) struct acrn_vm_config *vm_config; if (argc == 2U) { - guest_no = strtol_deci(argv[1]); + guest_no = sanitize_vmid(strtol_deci(argv[1])); } vuart_vmid = guest_no; @@ -1115,7 +1131,7 @@ static int32_t shell_show_vioapic_info(int32_t argc, char **argv) } ret = strtol_deci(argv[1]); if (ret >= 0) { - vmid = (uint16_t) ret; + vmid = sanitize_vmid((uint16_t) ret); get_vioapic_info(shell_log_buf, SHELL_LOG_BUF_SIZE, vmid); shell_puts(shell_log_buf); return 0;