Merge "IPACM: support IPA_RM dependency for CPE project"
diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp
index 3d388f9..c4a7e52 100644
--- a/ipacm/src/IPACM_Conntrack_NATApp.cpp
+++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp
@@ -77,24 +77,27 @@
 	memset(cache, 0, size);
 
 	nALGPort = pConfig->GetAlgPortCnt();
-	pALGPorts = (ipacm_alg *)malloc(sizeof(ipacm_alg) * nALGPort);
-	if(pALGPorts == NULL)
+	if(nALGPort > 0)
 	{
-		IPACMERR("Unable to allocate memory for alg prots\n");
-		goto fail;
-	}
-	memset(pALGPorts, 0, sizeof(ipacm_alg) * nALGPort);
+		pALGPorts = (ipacm_alg *)malloc(sizeof(ipacm_alg) * nALGPort);
+		if(pALGPorts == NULL)
+		{
+			IPACMERR("Unable to allocate memory for alg prots\n");
+			goto fail;
+		}
+		memset(pALGPorts, 0, sizeof(ipacm_alg) * nALGPort);
 
-	if(pConfig->GetAlgPorts(nALGPort, pALGPorts) != 0)
-	{
-		IPACMERR("Unable to retrieve ALG prots\n");
-		goto fail;
-	}
+		if(pConfig->GetAlgPorts(nALGPort, pALGPorts) != 0)
+		{
+			IPACMERR("Unable to retrieve ALG prots\n");
+			goto fail;
+		}
 
-	IPACMDBG("Printing %d alg ports information\n", nALGPort);
-	for(int cnt=0; cnt<nALGPort; cnt++)
-	{
-		IPACMDBG("%d: Proto[%d], port[%d]\n", cnt, pALGPorts[cnt].protocol, pALGPorts[cnt].port);
+		IPACMDBG("Printing %d alg ports information\n", nALGPort);
+		for(int cnt=0; cnt<nALGPort; cnt++)
+		{
+			IPACMDBG("%d: Proto[%d], port[%d]\n", cnt, pALGPorts[cnt].protocol, pALGPorts[cnt].port);
+		}
 	}
 
 	return 0;
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index 6758933..a5b5eae 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -78,6 +78,9 @@
 	ipv6_set = 0;
 	ipv4_header_set = false;
 	ipv6_header_set = false;
+	odu_route_rule_v4_hdl = NULL;
+	odu_route_rule_v6_hdl = NULL;
+	eth_client = NULL;
 	int m_fd_odu, ret = IPACM_SUCCESS;
 
 	Nat_App = NatApp::GetInstance();
@@ -4025,11 +4028,14 @@
 
 	flt_rule.rule.eq_attrib.rule_eq_bitmap = 0;
 
-	flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
-	flt_rule.rule.eq_attrib.metadata_meq32_present = 1;
-	flt_rule.rule.eq_attrib.metadata_meq32.offset = 0;
-	flt_rule.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
-	flt_rule.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask;
+	if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA)
+	{
+		flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
+		flt_rule.rule.eq_attrib.metadata_meq32_present = 1;
+		flt_rule.rule.eq_attrib.metadata_meq32.offset = 0;
+		flt_rule.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
+		flt_rule.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask;
+	}
 
 	flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
 	flt_rule.rule.eq_attrib.protocol_eq_present = 1;
diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp
index 5a3c27d..f2cda33 100644
--- a/ipacm/src/IPACM_Wan.cpp
+++ b/ipacm/src/IPACM_Wan.cpp
@@ -75,6 +75,10 @@
 {
 	num_firewall_v4 = 0;
 	num_firewall_v6 = 0;
+	wan_route_rule_v4_hdl = NULL;
+	wan_route_rule_v6_hdl = NULL;
+	wan_route_rule_v6_hdl_a5 = NULL;
+	wan_client = NULL;
 
 	if(iface_query != NULL)
 	{
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 760cb61..165ef72 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -90,6 +90,7 @@
 
 	num_wifi_client = 0;
 	header_name_count = 0;
+	wlan_client = NULL;
 
 	if(iface_query != NULL)
 	{
@@ -2471,9 +2472,15 @@
 
 	for (i = 0; i < num_wifi_client; i++)
 	{
-		free(get_client_memptr(wlan_client, i)->p_hdr_info);
+		if(get_client_memptr(wlan_client, i)->p_hdr_info != NULL)
+		{
+			free(get_client_memptr(wlan_client, i)->p_hdr_info);
+		}
 	}
-	free(wlan_client);
+	if(wlan_client != NULL)
+	{
+		free(wlan_client);
+	}
 	if (tx_prop != NULL)
 	{
 		free(tx_prop);
@@ -3211,11 +3218,14 @@
 
 	flt_rule.rule.eq_attrib.rule_eq_bitmap = 0;
 
-	flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
-	flt_rule.rule.eq_attrib.metadata_meq32_present = 1;
-	flt_rule.rule.eq_attrib.metadata_meq32.offset = 0;
-	flt_rule.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
-	flt_rule.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask;
+	if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA)
+	{
+		flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<14);
+		flt_rule.rule.eq_attrib.metadata_meq32_present = 1;
+		flt_rule.rule.eq_attrib.metadata_meq32.offset = 0;
+		flt_rule.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data;
+		flt_rule.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask;
+	}
 
 	flt_rule.rule.eq_attrib.rule_eq_bitmap |= (1<<1);
 	flt_rule.rule.eq_attrib.protocol_eq_present = 1;