From ed29219f217f6e42b2a4c0881206c5ff22bfd0d1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Wed, 6 Jun 2018 17:37:49 +0100 Subject: [PATCH] Don't use enums in TPM struct fields MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When using an enum in a struct field, the compiler is free to decide to make it an unsigned type if it desires. This in turn leads to bugs when code does if ((def->foo = virDomainFooTypeFromString(str)) < 0) ... because 'def->foo' can't technically have an unsigned value from the compiler's POV. While it is possible to add (int) casts in the code example above, this is not desirable because it is easy to miss out such casts. eg the code fixed here caused an error with clang builds ../../src/conf/domain_conf.c:12838:73: error: comparison of unsigned enum expression < 0 is always false [-Werror,-Wtautological-compare] if ((def->version = virDomainTPMVersionTypeFromString(version)) < 0) { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~ Signed-off-by: Daniel P. Berrangé --- src/conf/domain_conf.c | 4 ++-- src/conf/domain_conf.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c1f2583c29..5be773cda4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12795,7 +12795,7 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, model = virXMLPropString(node, "model"); if (model != NULL && - (int)(def->model = virDomainTPMModelTypeFromString(model)) < 0) { + (def->model = virDomainTPMModelTypeFromString(model)) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unknown TPM frontend model '%s'"), model); goto error; @@ -12824,7 +12824,7 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; } - if ((int)(def->type = virDomainTPMBackendTypeFromString(backend)) < 0) { + if ((def->type = virDomainTPMBackendTypeFromString(backend)) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unknown TPM backend type '%s'"), backend); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5f8960d90b..8a8121bf83 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1307,10 +1307,10 @@ typedef enum { # define VIR_DOMAIN_TPM_DEFAULT_DEVICE "/dev/tpm0" struct _virDomainTPMDef { - virDomainTPMBackendType type; + int type; /* virDomainTPMBackendType */ virDomainDeviceInfo info; - virDomainTPMModel model; - virDomainTPMVersion version; + int model; /* virDomainTPMModel */ + int version; /* virDomainTPMVersion */ union { struct { virDomainChrSourceDef source; -- 2.47.2