Separate allocation of the def->graphics array from the allocation
and initialization of its first element.
Note that the only possible values of totalPresent at this point
are 0 or 1, because it equals to guiPresent + sdlPresent.
---
src/vbox/vbox_common.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 54e7d47..e609e02 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -3296,7 +3296,7 @@ vboxDumpVideo(virDomainDefPtr def, vboxGlobalData *data
ATTRIBUTE_UNUSED,
return 0;
}
-static void
+static int
vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
{
/* dump display options vrdp/gui/sdl */
@@ -3311,6 +3311,7 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine
*machine)
IVRDxServer *VRDxServer = NULL;
PRBool VRDxEnabled = PR_FALSE;
bool addDesktop = false;
+ int ret = -1;
def->ngraphics = 0;
@@ -3367,7 +3368,12 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine
*machine)
addDesktop = true;
}
- if ((totalPresent > 0) && (VIR_ALLOC_N(def->graphics, totalPresent)
>= 0)) {
+ if (totalPresent > 0 || addDesktop) {
+ if (VIR_ALLOC_N(def->graphics, 1) < 0)
+ goto cleanup;
+ }
+
+ if (totalPresent > 0) {
if ((guiPresent) && (VIR_ALLOC(def->graphics[def->ngraphics]) >=
0)) {
def->graphics[def->ngraphics]->type =
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP;
if (guiDisplay)
@@ -3381,7 +3387,7 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine
*machine)
def->graphics[def->ngraphics]->data.sdl.display = sdlDisplay;
def->ngraphics++;
}
- } else if (addDesktop && (VIR_ALLOC_N(def->graphics, 1) >= 0)) {
+ } else if (addDesktop) {
if (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0) {
const char *tmp;
def->graphics[def->ngraphics]->type =
VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP;
@@ -3401,11 +3407,10 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data,
IMachine *machine)
gVBoxAPI.UIVRDxServer.GetEnabled(VRDxServer, &VRDxEnabled);
if (VRDxEnabled) {
+ if (VIR_REALLOC_N(def->graphics, totalPresent) < 0)
+ goto cleanup;
- totalPresent++;
-
- if ((VIR_REALLOC_N(def->graphics, totalPresent) >= 0) &&
- (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0)) {
+ if (VIR_ALLOC(def->graphics[def->ngraphics]) >= 0) {
PRUnichar *netAddressUtf16 = NULL;
char *netAddressUtf8 = NULL;
PRBool allowMultiConnection = PR_FALSE;
@@ -3437,8 +3442,14 @@ vboxDumpDisplay(virDomainDefPtr def, vboxGlobalData *data, IMachine
*machine)
}
}
+ ret = 0;
+
+ cleanup:
+ VBOX_UTF8_FREE(guiDisplay);
+ VBOX_UTF8_FREE(sdlDisplay);
VBOX_RELEASE(VRDxServer);
VBOX_UTF8_FREE(valueTypeUtf8);
+ return ret;
}
static void
@@ -3971,7 +3982,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int
flags)
if (vboxDumpVideo(def, data, machine) < 0)
goto cleanup;
- vboxDumpDisplay(def, data, machine);
+ if (vboxDumpDisplay(def, data, machine) < 0)
+ goto cleanup;
/* As the medium interface changed from 3.0 to 3.1.
* There are two totally different implementations.
--
2.4.10