[PATCH] virQEMUDriverGetDomainCapabilities: Validate machine type

Michal Prívozník mprivozn at redhat.com
Thu Dec 22 11:42:57 UTC 2022


On 12/22/22 10:48, Michal Privoznik wrote:
> When calling virConnectGetDomainCapabilities() (exposed as virsh
> domcapabilities) users have option to specify whatever sub-set of
> { emulatorbin, arch, machine, virttype } they want. Then we have
> a logic (hidden in virQEMUCapsCacheLookupDefault()) that picks
> qemuCaps that satisfy values passed by user. And whatever was not
> specified is then set to the default value as specified by picked
> qemuCaps. For instance: if no machine type was provided but
> emulatorbin was, then the machine type is set to the default one
> as defined by the emulatorbin.
> 
> Or, when just virttype was set then the remaining three values
> are set to their respective defaults. Except, we have a crasher
> in this case:
> 
>   # virsh domcapabilities --virttype hvf
>   error: Disconnected from qemu:///system due to end of file
>   error: failed to get emulator capabilities
>   error: End of file while reading data: Input/output error
> 
> This is because for 'hvf' virttype (at least my) QEMU does not
> have any machine type. Therefore, @machine is set to NULL and the
> rest of the code does not expect that.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_conf.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index ae5bbcd138..cbd339f594 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1454,6 +1454,13 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
>      g_autoptr(virDomainCaps) domCaps = NULL;
>      const char *path = virQEMUCapsGetBinary(qemuCaps);
>  
> +    if (!virQEMUCapsIsMachineSupported(qemuCaps, virttype, machine)) {
> +        virReportError(VIR_ERR_INVALID_ARG,
> +                       _("the machine '%s' is not supported by emulator '%s'"),
> +                       NULLSTR(machine), path);
> +        return NULL;
> +    }
> +
>      if (!(domCaps = virDomainCapsNew(path, machine, arch, virttype)))
>          return NULL;
>  

Self-NAK. We can do even better and validate the @arch and @virttype
too. V2 coming shortly.

Michal



More information about the libvir-list mailing list