diff --git a/src/libvirt.c b/src/libvirt.c index c609202e4efa3377ab2bde9bc888903c2d458ce4..f412a823cd5a2255c99450c5fa04c73a8e355299 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -7226,8 +7226,8 @@ error: * * Change a subset or all parameters of interface; currently this * includes bandwidth parameters. The value of @flags should be - * either VIR_DOMAIN_AFFECT_CURRENT, or a bitwise-or of values from - * VIR_DOMAIN_AFFECT_LIVE and VIR_DOMAIN_AFFECT_CURRENT, although + * either VIR_DOMAIN_AFFECT_CURRENT, or a bitwise-or of values + * VIR_DOMAIN_AFFECT_LIVE and VIR_DOMAIN_AFFECT_CONFIG, although * hypervisors vary in which flags are supported. * * This function may require privileged access to the hypervisor. diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7945c5dbd9b77c97e7029f59e7aaefab6bc2d756..ce637965e9821d538f90b8e8caa0ab6d9441951c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7779,20 +7779,12 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, } } - if (VIR_ALLOC(bandwidth) < 0) { + if ((VIR_ALLOC(bandwidth) < 0) || + (VIR_ALLOC(bandwidth->in) < 0) || + (VIR_ALLOC(bandwidth->out) < 0)) { virReportOOMError(); goto cleanup; } - if (VIR_ALLOC(bandwidth->in) < 0) { - virReportOOMError(); - goto cleanup; - } - memset(bandwidth->in, 0, sizeof(*bandwidth->in)); - if (VIR_ALLOC(bandwidth->out) < 0) { - virReportOOMError(); - goto cleanup; - } - memset(bandwidth->out, 0, sizeof(*bandwidth->out)); for (i = 0; i < nparams; i++) { virTypedParameterPtr param = ¶ms[i]; @@ -7817,11 +7809,9 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, * inbound/outbound to not be set. */ if (!bandwidth->in->average) { VIR_FREE(bandwidth->in); - bandwidth->in = NULL; } if (!bandwidth->out->average) { VIR_FREE(bandwidth->out); - bandwidth->out = NULL; } if (flags & VIR_DOMAIN_AFFECT_LIVE) { @@ -7833,29 +7823,27 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, /* virNetDevBandwidthSet() will clear any previous value of * bandwidth parameters, so merge with old bandwidth parameters * here to prevent them from being lost. */ - if (bandwidth->in || net->bandwidth->in) { + if (bandwidth->in || + (net->bandwidth && net->bandwidth->in)) { if (VIR_ALLOC(newBandwidth->in) < 0) { virReportOOMError(); goto cleanup; } - if (bandwidth->in) - memcpy(newBandwidth->in, bandwidth->in, - sizeof(*newBandwidth->in)); - else if (net->bandwidth->in) - memcpy(newBandwidth->in, net->bandwidth->in, - sizeof(*newBandwidth->in)); - } - if (bandwidth->out || net->bandwidth->out) { + + memcpy(newBandwidth->in, + bandwidth->in ? bandwidth->in : net->bandwidth->in, + sizeof(*newBandwidth->in)); + } + if (bandwidth->out || + (net->bandwidth && net->bandwidth->out)) { if (VIR_ALLOC(newBandwidth->out) < 0) { virReportOOMError(); goto cleanup; } - if (bandwidth->out) - memcpy(newBandwidth->out, bandwidth->out, - sizeof(*newBandwidth->out)); - else if (net->bandwidth->out) - memcpy(newBandwidth->out, net->bandwidth->out, - sizeof(*newBandwidth->out)); + + memcpy(newBandwidth->out, + bandwidth->out ? bandwidth->out : net->bandwidth->out, + sizeof(*newBandwidth->out)); } if (virNetDevBandwidthSet(net->ifname, newBandwidth) < 0) {