This strictens the parser to disallow negative values (interpreted as
`UINT_MAX + value + 1`) for attribute `id`. Allowing negative
numbers to be interpreted this way makes no sense for this attribute.
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
src/conf/domain_conf.c | 74 ++++++++++++------------------------------
1 file changed, 21 insertions(+), 53 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9e6719265f..2142e45fd5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13122,40 +13122,18 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt
G_GNUC_UNUSED,
{
virDomainAudioDef *def;
VIR_XPATH_NODE_AUTORESTORE(ctxt)
- g_autofree char *tmp = NULL;
- g_autofree char *typestr = NULL;
- int type;
xmlNodePtr inputNode, outputNode;
def = g_new0(virDomainAudioDef, 1);
ctxt->node = node;
- typestr = virXMLPropString(node, "type");
- if (!typestr) {
- virReportError(VIR_ERR_XML_ERROR, "%s",
- _("missing audio 'type' attribute"));
- goto error;
- }
-
- if ((type = virDomainAudioTypeTypeFromString(typestr)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown audio type '%s'"), typestr);
+ if (virXMLPropEnum(node, "type", virDomainAudioTypeTypeFromString,
+ VIR_XML_PROP_REQUIRED, &def->type) < 0)
goto error;
- }
- def->type = type;
- tmp = virXMLPropString(node, "id");
- if (!tmp) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("missing audio 'id' attribute"));
- goto error;
- }
- if (virStrToLong_ui(tmp, NULL, 10, &def->id) < 0 ||
- def->id == 0) {
- virReportError(VIR_ERR_XML_ERROR,
- _("invalid audio 'id' value '%s'"),
tmp);
+ if (virXMLPropUInt(node, "id", 10, VIR_XML_PROP_REQUIRED |
VIR_XML_PROP_NONZERO,
+ &def->id) < 0)
goto error;
- }
inputNode = virXPathNode("./input", ctxt);
outputNode = virXPathNode("./output", ctxt);
@@ -13191,29 +13169,25 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt
G_GNUC_UNUSED,
break;
case VIR_DOMAIN_AUDIO_TYPE_OSS: {
- g_autofree char *tryMMap = virXMLPropString(node, "tryMMap");
- g_autofree char *exclusive = virXMLPropString(node, "exclusive");
- g_autofree char *dspPolicy = virXMLPropString(node, "dspPolicy");
+ int dspPolicySet;
- if (tryMMap && ((def->backend.oss.tryMMap =
- virTristateBoolTypeFromString(tryMMap)) <= 0)) {
- virReportError(VIR_ERR_XML_ERROR,
- _("unknown 'tryMMap' value '%s'"),
tryMMap);
+ if (virXMLPropTristateBool(node, "tryMMap", VIR_XML_PROP_NONE,
+ &def->backend.oss.tryMMap) < 0)
goto error;
- }
- if (exclusive && ((def->backend.oss.exclusive =
- virTristateBoolTypeFromString(exclusive)) <= 0)) {
- virReportError(VIR_ERR_XML_ERROR,
- _("unknown 'exclusive' value '%s'"),
exclusive);
+ if (virXMLPropTristateBool(node, "exclusive", VIR_XML_PROP_NONE,
+ &def->backend.oss.exclusive) < 0)
+ goto error;
+
+ if ((dspPolicySet = virXMLPropInt(node, "dspPolicy", 10,
VIR_XML_PROP_NONE,
+ &def->backend.oss.dspPolicy, 0)) < 0)
goto error;
- }
- if (dspPolicy) {
- if (virStrToLong_i(dspPolicy, NULL, 10,
- &def->backend.oss.dspPolicy) < 0) {
+ if (dspPolicySet != 0) {
+ if (def->backend.oss.dspPolicy < 0) {
virReportError(VIR_ERR_XML_ERROR,
- _("cannot parse 'dspPolicy' value
'%s'"), dspPolicy);
+ _("cannot parse 'dspPolicy' value
'%i'"),
+ def->backend.oss.dspPolicy);
goto error;
}
def->backend.oss.dspPolicySet = true;
@@ -13236,16 +13210,10 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlopt
G_GNUC_UNUSED,
break;
case VIR_DOMAIN_AUDIO_TYPE_SDL: {
- g_autofree char *driverstr = virXMLPropString(node, "driver");
- int driver;
- if (driverstr) {
- if ((driver = virDomainAudioSDLDriverTypeFromString(driverstr)) <= 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown SDL driver '%s'"), driverstr);
- goto error;
- }
- def->backend.sdl.driver = driver;
- }
+ if (virXMLPropEnum(node, "driver",
virDomainAudioSDLDriverTypeFromString,
+ VIR_XML_PROP_NONZERO, &def->backend.sdl.driver) <
0)
+ goto error;
+
if (inputNode)
virDomainAudioSDLParse(&def->backend.sdl.input, inputNode);
if (outputNode)
--
2.26.3