[libvirt] [PATCH v2] Set the number of elements 0 in virNetwork*Clear
Michal Privoznik
mprivozn at redhat.com
Fri Jul 26 11:00:34 UTC 2013
On 26.07.2013 12:54, Ján Tomko wrote:
> Decrementing it when it was already 0 causes an invalid free
> in virNetworkDefUpdateDNSHost if virNetworkDNSHostDefParseXML
> fails and virNetworkDNSHostDefClear gets called twice.
>
> virNetworkForwardDefClear left the number untouched even if it
> freed all the elements.
> ---
> src/conf/network_conf.c | 21 +++++++++++----------
> 1 file changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
> index d616e12..490b04d 100644
> --- a/src/conf/network_conf.c
> +++ b/src/conf/network_conf.c
> @@ -134,8 +134,8 @@ virNetworkIpDefClear(virNetworkIpDefPtr def)
> VIR_FREE(def->family);
> VIR_FREE(def->ranges);
>
> - while (def->nhosts--)
> - virNetworkDHCPHostDefClear(&def->hosts[def->nhosts]);
> + while (def->nhosts)
> + virNetworkDHCPHostDefClear(&def->hosts[--def->nhosts]);
>
> VIR_FREE(def->hosts);
> VIR_FREE(def->tftproot);
> @@ -158,8 +158,8 @@ virNetworkDNSTxtDefClear(virNetworkDNSTxtDefPtr def)
> static void
> virNetworkDNSHostDefClear(virNetworkDNSHostDefPtr def)
> {
> - while (def->nnames--)
> - VIR_FREE(def->names[def->nnames]);
> + while (def->nnames)
> + VIR_FREE(def->names[--def->nnames]);
> VIR_FREE(def->names);
> }
>
> @@ -176,18 +176,18 @@ static void
> virNetworkDNSDefClear(virNetworkDNSDefPtr def)
> {
> if (def->txts) {
> - while (def->ntxts--)
> - virNetworkDNSTxtDefClear(&def->txts[def->ntxts]);
> + while (def->ntxts)
> + virNetworkDNSTxtDefClear(&def->txts[--def->ntxts]);
> VIR_FREE(def->txts);
> }
> if (def->hosts) {
> - while (def->nhosts--)
> - virNetworkDNSHostDefClear(&def->hosts[def->nhosts]);
> + while (def->nhosts)
> + virNetworkDNSHostDefClear(&def->hosts[--def->nhosts]);
> VIR_FREE(def->hosts);
> }
> if (def->srvs) {
> - while (def->nsrvs--)
> - virNetworkDNSSrvDefClear(&def->srvs[def->nsrvs]);
> + while (def->nsrvs)
> + virNetworkDNSSrvDefClear(&def->srvs[--def->nsrvs]);
> VIR_FREE(def->srvs);
> }
> }
> @@ -206,6 +206,7 @@ virNetworkForwardDefClear(virNetworkForwardDefPtr def)
> virNetworkForwardIfDefClear(&def->ifs[i]);
> }
> VIR_FREE(def->ifs);
> + def->nifs = def->npfs = 0;
> }
>
> void
>
ACK
Michal
More information about the libvir-list
mailing list