mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-23 20:02:21 +00:00
nwfilter: fix leaking of filter parameters upon error
The filter parameters were not correctly free'd when an error hits while adding to the hash table. Reviewed-by: Jiri Denemark <jdenemar@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
94d31e7c0e
commit
1c425d735d
@ -143,19 +143,20 @@ virNWFilterRuleInstFree(virNWFilterRuleInstPtr inst)
|
|||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
|
virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
|
||||||
char *macaddr,
|
const char *macaddr,
|
||||||
const virNWFilterVarValue *ipaddr)
|
const virNWFilterVarValue *ipaddr)
|
||||||
{
|
{
|
||||||
virNWFilterVarValue *val;
|
virNWFilterVarValue *val;
|
||||||
|
|
||||||
if (macaddr) {
|
if (macaddr) {
|
||||||
val = virNWFilterVarValueCreateSimple(macaddr);
|
val = virNWFilterVarValueCreateSimpleCopyValue(macaddr);
|
||||||
if (!val)
|
if (!val)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (virHashAddEntry(table,
|
if (virHashAddEntry(table,
|
||||||
NWFILTER_STD_VAR_MAC,
|
NWFILTER_STD_VAR_MAC,
|
||||||
val) < 0) {
|
val) < 0) {
|
||||||
|
virNWFilterVarValueFree(val);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("Could not add variable 'MAC' to hashmap"));
|
"%s", _("Could not add variable 'MAC' to hashmap"));
|
||||||
return -1;
|
return -1;
|
||||||
@ -170,6 +171,7 @@ virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
|
|||||||
if (virHashAddEntry(table,
|
if (virHashAddEntry(table,
|
||||||
NWFILTER_STD_VAR_IP,
|
NWFILTER_STD_VAR_IP,
|
||||||
val) < 0) {
|
val) < 0) {
|
||||||
|
virNWFilterVarValueFree(val);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("Could not add variable 'IP' to hashmap"));
|
"%s", _("Could not add variable 'IP' to hashmap"));
|
||||||
return -1;
|
return -1;
|
||||||
@ -192,7 +194,7 @@ virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
|
|||||||
* Returns pointer to hashmap, NULL if an error occurred.
|
* Returns pointer to hashmap, NULL if an error occurred.
|
||||||
*/
|
*/
|
||||||
virHashTablePtr
|
virHashTablePtr
|
||||||
virNWFilterCreateVarHashmap(char *macaddr,
|
virNWFilterCreateVarHashmap(const char *macaddr,
|
||||||
const virNWFilterVarValue *ipaddr)
|
const virNWFilterVarValue *ipaddr)
|
||||||
{
|
{
|
||||||
virHashTablePtr table = virNWFilterHashTableCreate(0);
|
virHashTablePtr table = virNWFilterHashTableCreate(0);
|
||||||
@ -767,9 +769,7 @@ virNWFilterInstantiateFilterUpdate(virNWFilterDriverStatePtr driver,
|
|||||||
virNWFilterDefPtr filter;
|
virNWFilterDefPtr filter;
|
||||||
virNWFilterDefPtr newFilter;
|
virNWFilterDefPtr newFilter;
|
||||||
char vmmacaddr[VIR_MAC_STRING_BUFLEN] = {0};
|
char vmmacaddr[VIR_MAC_STRING_BUFLEN] = {0};
|
||||||
char *str_macaddr = NULL;
|
|
||||||
virNWFilterVarValuePtr ipaddr;
|
virNWFilterVarValuePtr ipaddr;
|
||||||
char *str_ipaddr = NULL;
|
|
||||||
|
|
||||||
techdriver = virNWFilterTechDriverForName(drvname);
|
techdriver = virNWFilterTechDriverForName(drvname);
|
||||||
|
|
||||||
@ -788,22 +788,15 @@ virNWFilterInstantiateFilterUpdate(virNWFilterDriverStatePtr driver,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
virMacAddrFormat(macaddr, vmmacaddr);
|
virMacAddrFormat(macaddr, vmmacaddr);
|
||||||
if (VIR_STRDUP(str_macaddr, vmmacaddr) < 0) {
|
|
||||||
rc = -1;
|
|
||||||
goto err_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipaddr = virNWFilterIPAddrMapGetIPAddr(ifname);
|
ipaddr = virNWFilterIPAddrMapGetIPAddr(ifname);
|
||||||
|
|
||||||
vars1 = virNWFilterCreateVarHashmap(str_macaddr, ipaddr);
|
vars1 = virNWFilterCreateVarHashmap(vmmacaddr, ipaddr);
|
||||||
if (!vars1) {
|
if (!vars1) {
|
||||||
rc = -1;
|
rc = -1;
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
str_macaddr = NULL;
|
|
||||||
str_ipaddr = NULL;
|
|
||||||
|
|
||||||
vars = virNWFilterCreateVarsFrom(vars1,
|
vars = virNWFilterCreateVarsFrom(vars1,
|
||||||
filterparams);
|
filterparams);
|
||||||
if (!vars) {
|
if (!vars) {
|
||||||
@ -840,9 +833,6 @@ virNWFilterInstantiateFilterUpdate(virNWFilterDriverStatePtr driver,
|
|||||||
err_exit:
|
err_exit:
|
||||||
virNWFilterObjUnlock(obj);
|
virNWFilterObjUnlock(obj);
|
||||||
|
|
||||||
VIR_FREE(str_ipaddr);
|
|
||||||
VIR_FREE(str_macaddr);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ int virNWFilterInstantiateFilterLate(virNWFilterDriverStatePtr driver,
|
|||||||
|
|
||||||
int virNWFilterTeardownFilter(const virDomainNetDef *net);
|
int virNWFilterTeardownFilter(const virDomainNetDef *net);
|
||||||
|
|
||||||
virHashTablePtr virNWFilterCreateVarHashmap(char *macaddr,
|
virHashTablePtr virNWFilterCreateVarHashmap(const char *macaddr,
|
||||||
const virNWFilterVarValue *value);
|
const virNWFilterVarValue *value);
|
||||||
|
|
||||||
int virNWFilterDomainFWUpdateCB(virDomainObjPtr vm,
|
int virNWFilterDomainFWUpdateCB(virDomainObjPtr vm,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user