From 73cfdbff6511a49b348028db9bfae1e024e7efcf Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 15 May 2012 16:16:49 +0100 Subject: [PATCH] Fix virDomainDeviceInfoIsSet() to check all struct fields The virDomainDeviceInfoIsSet API was only checking if an address or alias was set in the struct. Thus if only a rom bar setting / filename, boot index, or USB master value was set, they could be accidentally dropped when formatting XML (cherry picked from commit 2c195fdbf3293792e39bc4f06755ae751025b0ea) --- src/conf/domain_conf.c | 15 +++++++++++---- src/conf/domain_conf.h | 4 ++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8a39721acd..9d059044e4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1896,14 +1896,21 @@ int virDomainDevicePCIAddressIsValid(virDomainDevicePCIAddressPtr addr) } -static int +static bool virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info, unsigned int flags) { if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) - return 1; + return true; if (info->alias && !(flags & VIR_DOMAIN_XML_INACTIVE)) - return 1; - return 0; + return true; + if (info->mastertype != VIR_DOMAIN_CONTROLLER_MASTER_NONE) + return true; + if ((info->rombar != VIR_DOMAIN_PCI_ROMBAR_DEFAULT) || + info->romfile) + return true; + if (info->bootIndex) + return true; + return false; } void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0eed60e02a..1b8741e211 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -253,6 +253,10 @@ struct _virDomainDeviceUSBMaster { typedef struct _virDomainDeviceInfo virDomainDeviceInfo; typedef virDomainDeviceInfo *virDomainDeviceInfoPtr; struct _virDomainDeviceInfo { + /* If adding to this struct, ensure that + * virDomainDeviceInfoIsSet() is updated + * to consider the new fields + */ char *alias; int type; union {