[libvirt] [PATCH] PHYP: Checking for NULL values when building new guest
Matthias Bolte
matthias.bolte at googlemail.com
Fri Aug 20 19:32:32 UTC 2010
2010/8/20 Eduardo Otubo <otubo at linux.vnet.ibm.com>:
> When creating a new gust, the function phypBuildLpar() was not
> checking for NULL values, making the driver to have a segmentation
> fault.
> ---
> src/phyp/phyp_driver.c | 19 +++++++++++++++++++
> 1 files changed, 19 insertions(+), 0 deletions(-)
>
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index 251111d..999870e 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -3701,6 +3701,25 @@ phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
> int exit_status = 0;
> virBuffer buf = VIR_BUFFER_INITIALIZER;
>
> + if (!def->name) {
> + VIR_ERROR0(_("Field \"<name>\" on the domain XML file missing."));
> + goto err;
def->name cannot be NULL, virDomainDefParseXML fails when there is no
name given in the domain XML
> + } else if (!def->memory) {
> + VIR_ERROR0(_
> + ("Field \"<memory>\" on the domain XML file missing."));
> + goto err;
> + } else if (!def->maxmem) {
> + VIR_ERROR0(_
> + ("Field \"<currentMemory>\" on the domain XML file missing."));
> + goto err;
memory and maxmem might be 0 when the user sets the to 0 in the domain
XML. IMHO comparing > 0 is cleaner here.
Also the error message is misleading here. The elements aren't
missing, but the user might have specified a value that is invalid for
this driver.
> + } else if (!def->vcpus) {
> + VIR_ERROR0(_("Field \"<vcpu>\" on the domain XML file missing."));
> + goto err;
vcpus can only be 0 when the user explicitly specified it that way,
the vcpu element isn't missing in that case. If the element is really
missing then vcpus defaults to 1.
> + } else if (!def->disks[0]->src) {
> + VIR_ERROR0(_("Field \"<disk>\" on the domain XML file missing."));
> + goto err;
> + }
This can segfault because you dereference the first disk element
without even checking if there are any disks.
Once again the error message is misleading.
Also you should use PHYP_ERROR instead of VIR_ERROR here, because
VIR_ERROR will just output the error to the log and doesn't raise an
error at the libvirt API level, but this is required when a driver
functions fails.
In general all other occurrences of VIR_ERROR in this driver should
be replaced by PHYP_ERROR for the same reason.
There are also several instances of VIR_WARN followed by goto err that
should be PHYP_ERRORs too.
Matthias
More information about the libvir-list
mailing list