提交 240ee7c1 编写于 作者: A Andrea Bolognani

conf: Perform error checking in virDomainDeviceInfoFormat()

virXMLFormatElement() might fail, but we were not checking
its return value.

Fixing this requires us to change virDomainDeviceInfoFormat()
so that it can report an error back to the caller.

Introduced-by: 0d6b8733
Spotted-by: Coverity
Reported-by: NJohn Ferlan <jferlan@redhat.com>
Signed-off-by: NAndrea Bolognani <abologna@redhat.com>
Reviewed-by: NPavel Hrdina <phrdina@redhat.com>
上级 c3a208af
...@@ -6418,13 +6418,14 @@ virDomainVirtioOptionsFormat(virBufferPtr buf, ...@@ -6418,13 +6418,14 @@ virDomainVirtioOptionsFormat(virBufferPtr buf,
} }
static void ATTRIBUTE_NONNULL(2) static int ATTRIBUTE_NONNULL(2)
virDomainDeviceInfoFormat(virBufferPtr buf, virDomainDeviceInfoFormat(virBufferPtr buf,
virDomainDeviceInfoPtr info, virDomainDeviceInfoPtr info,
unsigned int flags) unsigned int flags)
{ {
virBuffer attrBuf = VIR_BUFFER_INITIALIZER; virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
virBuffer childBuf = VIR_BUFFER_INITIALIZER; virBuffer childBuf = VIR_BUFFER_INITIALIZER;
int ret = -1;
if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) { if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) && info->bootIndex) {
virBufferAsprintf(buf, "<boot order='%u'", info->bootIndex); virBufferAsprintf(buf, "<boot order='%u'", info->bootIndex);
...@@ -6467,8 +6468,11 @@ virDomainDeviceInfoFormat(virBufferPtr buf, ...@@ -6467,8 +6468,11 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
} }
if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390) {
return; /* We're done here */
ret = 0;
goto cleanup;
}
virBufferAsprintf(&attrBuf, " type='%s'", virBufferAsprintf(&attrBuf, " type='%s'",
virDomainDeviceAddressTypeToString(info->type)); virDomainDeviceAddressTypeToString(info->type));
...@@ -6562,10 +6566,16 @@ virDomainDeviceInfoFormat(virBufferPtr buf, ...@@ -6562,10 +6566,16 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
break; break;
} }
virXMLFormatElement(buf, "address", &attrBuf, &childBuf); if (virXMLFormatElement(buf, "address", &attrBuf, &childBuf) < 0)
goto cleanup;
ret = 0;
cleanup:
virBufferFreeAndReset(&attrBuf); virBufferFreeAndReset(&attrBuf);
virBufferFreeAndReset(&childBuf); virBufferFreeAndReset(&childBuf);
return ret;
} }
static int static int
...@@ -24299,8 +24309,10 @@ virDomainDiskDefFormat(virBufferPtr buf, ...@@ -24299,8 +24309,10 @@ virDomainDiskDefFormat(virBufferPtr buf,
if (def->src->encryption && !def->src->encryptionInherited && if (def->src->encryption && !def->src->encryptionInherited &&
virStorageEncryptionFormat(buf, def->src->encryption) < 0) virStorageEncryptionFormat(buf, def->src->encryption) < 0)
return -1; return -1;
virDomainDeviceInfoFormat(buf, &def->info, if (virDomainDeviceInfoFormat(buf, &def->info,
flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT); flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) < 0) {
return -1;
}
if (virDomainDiskDefFormatPrivateData(buf, def, flags, xmlopt) < 0) if (virDomainDiskDefFormatPrivateData(buf, def, flags, xmlopt) < 0)
return -1; return -1;
...@@ -24475,7 +24487,8 @@ virDomainControllerDefFormat(virBufferPtr buf, ...@@ -24475,7 +24487,8 @@ virDomainControllerDefFormat(virBufferPtr buf,
virDomainControllerDriverFormat(&childBuf, def); virDomainControllerDriverFormat(&childBuf, def);
virDomainDeviceInfoFormat(&childBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0)
goto cleanup;
if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
def->opts.pciopts.pcihole64) { def->opts.pciopts.pcihole64) {
...@@ -24613,7 +24626,8 @@ virDomainFSDefFormat(virBufferPtr buf, ...@@ -24613,7 +24626,8 @@ virDomainFSDefFormat(virBufferPtr buf,
if (def->readonly) if (def->readonly)
virBufferAddLit(buf, "<readonly/>\n"); virBufferAddLit(buf, "<readonly/>\n");
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
goto cleanup;
if (def->space_hard_limit) if (def->space_hard_limit)
virBufferAsprintf(buf, "<space_hard_limit unit='bytes'>" virBufferAsprintf(buf, "<space_hard_limit unit='bytes'>"
...@@ -25412,9 +25426,11 @@ virDomainNetDefFormat(virBufferPtr buf, ...@@ -25412,9 +25426,11 @@ virDomainNetDefFormat(virBufferPtr buf,
virDomainNetDefCoalesceFormatXML(buf, def->coalesce); virDomainNetDefCoalesceFormatXML(buf, def->coalesce);
virDomainDeviceInfoFormat(buf, &def->info, if (virDomainDeviceInfoFormat(buf, &def->info,
flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT
| VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM); | VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM) < 0) {
return -1;
}
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</interface>\n"); virBufferAddLit(buf, "</interface>\n");
...@@ -25723,7 +25739,8 @@ virDomainChrDefFormat(virBufferPtr buf, ...@@ -25723,7 +25739,8 @@ virDomainChrDefFormat(virBufferPtr buf,
if (virDomainChrTargetDefFormat(buf, def, flags) < 0) if (virDomainChrTargetDefFormat(buf, def, flags) < 0)
return -1; return -1;
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAsprintf(buf, "</%s>\n", elementName); virBufferAsprintf(buf, "</%s>\n", elementName);
...@@ -25772,7 +25789,8 @@ virDomainSmartcardDefFormat(virBufferPtr buf, ...@@ -25772,7 +25789,8 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
_("unexpected smartcard type %d"), def->type); _("unexpected smartcard type %d"), def->type);
goto cleanup; goto cleanup;
} }
virDomainDeviceInfoFormat(&childBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0)
goto cleanup;
if (virBufferCheckError(&childBuf) < 0) if (virBufferCheckError(&childBuf) < 0)
goto cleanup; goto cleanup;
...@@ -25843,7 +25861,8 @@ virDomainTPMDefFormat(virBufferPtr buf, ...@@ -25843,7 +25861,8 @@ virDomainTPMDefFormat(virBufferPtr buf,
break; break;
} }
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</tpm>\n"); virBufferAddLit(buf, "</tpm>\n");
...@@ -25873,7 +25892,8 @@ virDomainSoundDefFormat(virBufferPtr buf, ...@@ -25873,7 +25892,8 @@ virDomainSoundDefFormat(virBufferPtr buf,
for (i = 0; i < def->ncodecs; i++) for (i = 0; i < def->ncodecs; i++)
virDomainSoundCodecDefFormat(&childBuf, def->codecs[i]); virDomainSoundCodecDefFormat(&childBuf, def->codecs[i]);
virDomainDeviceInfoFormat(&childBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0)
goto cleanup;
if (virBufferCheckError(&childBuf) < 0) if (virBufferCheckError(&childBuf) < 0)
goto cleanup; goto cleanup;
...@@ -25922,7 +25942,8 @@ virDomainMemballoonDefFormat(virBufferPtr buf, ...@@ -25922,7 +25942,8 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
if (def->period) if (def->period)
virBufferAsprintf(&childrenBuf, "<stats period='%i'/>\n", def->period); virBufferAsprintf(&childrenBuf, "<stats period='%i'/>\n", def->period);
virDomainDeviceInfoFormat(&childrenBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, flags) < 0)
goto cleanup;
if (def->virtio) { if (def->virtio) {
virBuffer driverBuf = VIR_BUFFER_INITIALIZER; virBuffer driverBuf = VIR_BUFFER_INITIALIZER;
...@@ -25965,7 +25986,8 @@ virDomainNVRAMDefFormat(virBufferPtr buf, ...@@ -25965,7 +25986,8 @@ virDomainNVRAMDefFormat(virBufferPtr buf,
{ {
virBufferAddLit(buf, "<nvram>\n"); virBufferAddLit(buf, "<nvram>\n");
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</nvram>\n"); virBufferAddLit(buf, "</nvram>\n");
...@@ -25998,7 +26020,8 @@ virDomainWatchdogDefFormat(virBufferPtr buf, ...@@ -25998,7 +26020,8 @@ virDomainWatchdogDefFormat(virBufferPtr buf,
goto cleanup; goto cleanup;
} }
virDomainDeviceInfoFormat(&childBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0)
goto cleanup;
if (virBufferCheckError(&childBuf) < 0) if (virBufferCheckError(&childBuf) < 0)
goto cleanup; goto cleanup;
...@@ -26035,7 +26058,8 @@ static int virDomainPanicDefFormat(virBufferPtr buf, ...@@ -26035,7 +26058,8 @@ static int virDomainPanicDefFormat(virBufferPtr buf,
virDomainPanicModelTypeToString(def->model)); virDomainPanicModelTypeToString(def->model));
virBufferSetChildIndent(&childrenBuf, buf); virBufferSetChildIndent(&childrenBuf, buf);
virDomainDeviceInfoFormat(&childrenBuf, &def->info, 0); if (virDomainDeviceInfoFormat(&childrenBuf, &def->info, 0) < 0)
goto cleanup;
if (virBufferCheckError(&childrenBuf) < 0) if (virBufferCheckError(&childrenBuf) < 0)
goto cleanup; goto cleanup;
...@@ -26087,7 +26111,8 @@ virDomainShmemDefFormat(virBufferPtr buf, ...@@ -26087,7 +26111,8 @@ virDomainShmemDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</shmem>\n"); virBufferAddLit(buf, "</shmem>\n");
...@@ -26144,7 +26169,8 @@ virDomainRNGDefFormat(virBufferPtr buf, ...@@ -26144,7 +26169,8 @@ virDomainRNGDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
goto cleanup;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</rng>\n"); virBufferAddLit(buf, "</rng>\n");
...@@ -26271,7 +26297,8 @@ virDomainMemoryDefFormat(virBufferPtr buf, ...@@ -26271,7 +26297,8 @@ virDomainMemoryDefFormat(virBufferPtr buf,
virDomainMemoryTargetDefFormat(buf, def); virDomainMemoryTargetDefFormat(buf, def);
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</memory>\n"); virBufferAddLit(buf, "</memory>\n");
...@@ -26348,7 +26375,8 @@ virDomainVideoDefFormat(virBufferPtr buf, ...@@ -26348,7 +26375,8 @@ virDomainVideoDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
} }
virDomainDeviceInfoFormat(buf, &def->info, flags); if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
goto cleanup;
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</video>\n"); virBufferAddLit(buf, "</video>\n");
...@@ -26404,7 +26432,8 @@ virDomainInputDefFormat(virBufferPtr buf, ...@@ -26404,7 +26432,8 @@ virDomainInputDefFormat(virBufferPtr buf,
virBufferAddLit(&childbuf, "/>\n"); virBufferAddLit(&childbuf, "/>\n");
} }
virBufferEscapeString(&childbuf, "<source evdev='%s'/>\n", def->source.evdev); virBufferEscapeString(&childbuf, "<source evdev='%s'/>\n", def->source.evdev);
virDomainDeviceInfoFormat(&childbuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childbuf, &def->info, flags) < 0)
goto cleanup;
if (virBufferCheckError(&childbuf) < 0) if (virBufferCheckError(&childbuf) < 0)
goto cleanup; goto cleanup;
...@@ -27004,9 +27033,11 @@ virDomainHostdevDefFormat(virBufferPtr buf, ...@@ -27004,9 +27033,11 @@ virDomainHostdevDefFormat(virBufferPtr buf,
if (def->shareable) if (def->shareable)
virBufferAddLit(buf, "<shareable/>\n"); virBufferAddLit(buf, "<shareable/>\n");
virDomainDeviceInfoFormat(buf, def->info, if (virDomainDeviceInfoFormat(buf, def->info,
flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT
| VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM); | VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM) < 0) {
return -1;
}
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</hostdev>\n"); virBufferAddLit(buf, "</hostdev>\n");
...@@ -27032,8 +27063,10 @@ virDomainRedirdevDefFormat(virBufferPtr buf, ...@@ -27032,8 +27063,10 @@ virDomainRedirdevDefFormat(virBufferPtr buf,
if (virDomainChrSourceDefFormat(buf, def->source, flags) < 0) if (virDomainChrSourceDefFormat(buf, def->source, flags) < 0)
return -1; return -1;
virDomainDeviceInfoFormat(buf, &def->info, if (virDomainDeviceInfoFormat(buf, &def->info,
flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT); flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT) < 0) {
return -1;
}
virBufferAdjustIndent(buf, -2); virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</redirdev>\n"); virBufferAddLit(buf, "</redirdev>\n");
return 0; return 0;
...@@ -27095,7 +27128,8 @@ virDomainHubDefFormat(virBufferPtr buf, ...@@ -27095,7 +27128,8 @@ virDomainHubDefFormat(virBufferPtr buf,
goto cleanup; goto cleanup;
} }
virDomainDeviceInfoFormat(&childBuf, &def->info, flags); if (virDomainDeviceInfoFormat(&childBuf, &def->info, flags) < 0)
goto cleanup;
if (virBufferCheckError(&childBuf) < 0) if (virBufferCheckError(&childBuf) < 0)
goto cleanup; goto cleanup;
...@@ -27816,7 +27850,8 @@ virDomainVsockDefFormat(virBufferPtr buf, ...@@ -27816,7 +27850,8 @@ virDomainVsockDefFormat(virBufferPtr buf,
if (virXMLFormatElement(&childBuf, "cid", &cidAttrBuf, NULL) < 0) if (virXMLFormatElement(&childBuf, "cid", &cidAttrBuf, NULL) < 0)
goto cleanup; goto cleanup;
virDomainDeviceInfoFormat(&childBuf, &vsock->info, 0); if (virDomainDeviceInfoFormat(&childBuf, &vsock->info, 0) < 0)
goto cleanup;
if (virXMLFormatElement(buf, "vsock", &attrBuf, &childBuf) < 0) if (virXMLFormatElement(buf, "vsock", &attrBuf, &childBuf) < 0)
goto cleanup; goto cleanup;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册