ipacm: KW fix

Fix KW issues and put condition to prevent access array
out of bound.

Change-Id: Iae5c84160b8298b8c8b5969438f9395269fad1fe
diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp
index 3a2d470..cab78e2 100644
--- a/ipacm/src/IPACM_CmdQueue.cpp
+++ b/ipacm/src/IPACM_CmdQueue.cpp
@@ -155,8 +155,12 @@
 			item = MsgQueueExternal->dequeue();
 			if(item)
 			{
-				IPACMDBG("Get event %s from external queue.\n",
-					IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event));
+				eventName = IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event);
+				if (eventName != NULL)
+				{
+					IPACMDBG("Get event %s from external queue.\n",
+							eventName);
+				}
 			}
 		}
 		else
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index c792e6e..871b957 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -748,7 +748,7 @@
 		if (ipa_interface_index == ipa_if_num)
 		{
 			IPACMDBG_H("Received IPA_DOWNSTREAM_ADD event.\n");
-			if (is_downstream_set[data->prefix.iptype] == false)
+			if (data->prefix.iptype < IPA_IP_MAX && is_downstream_set[data->prefix.iptype] == false)
 			{
 				IPACMDBG_H("Add downstream for IP iptype %d\n", data->prefix.iptype);
 				is_downstream_set[data->prefix.iptype] = true;
@@ -3331,46 +3331,43 @@
 
 #ifdef FEATURE_IPACM_HAL
 		/* add prefix equation in modem UL rules */
-		if(iptype == IPA_IP_v4)
+		if(iptype == IPA_IP_v4 && flt_rule_entry.rule.eq_attrib.num_offset_meq_32 < IPA_IPFLTR_NUM_MEQ_32_EQNS)
 		{
 			flt_rule_entry.rule.eq_attrib.num_offset_meq_32++;
-			if(flt_rule_entry.rule.eq_attrib.num_offset_meq_32 <= IPA_IPFLTR_NUM_MEQ_32_EQNS)
-			{
-				eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_32 - 1;
+			eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_32 - 1;
 #ifdef FEATURE_IPA_V3
-				if(eq_index == 0)
-				{
-					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<5);
-				}
-				else
-				{
-					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<6);
-				}
-#else
-				if(eq_index == 0)
-				{
-					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<2);
-				}
-				else
-				{
-					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3);
-				}
-#endif
-				flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].offset = 12;
-				flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].mask = prefix[IPA_IP_v4].v4Mask;
-				flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].value = prefix[IPA_IP_v4].v4Addr;
+			if(eq_index == 0)
+			{
+				flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<5);
 			}
 			else
 			{
-				IPACMERR("Run out of MEQ32 equation.\n");
-				flt_rule_entry.rule.eq_attrib.num_offset_meq_32--;
+				flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<6);
 			}
+#else
+			if(eq_index == 0)
+			{
+				flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<2);
+			}
+			else
+			{
+				flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<3);
+			}
+#endif
+			flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].offset = 12;
+			flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].mask = prefix[IPA_IP_v4].v4Mask;
+			flt_rule_entry.rule.eq_attrib.offset_meq_32[eq_index].value = prefix[IPA_IP_v4].v4Addr;
+		}
+		else if (flt_rule_entry.rule.eq_attrib.num_offset_meq_32 > IPA_IPFLTR_NUM_MEQ_32_EQNS)
+		{
+			IPACMERR("Run out of MEQ32 equation.\n");
+			flt_rule_entry.rule.eq_attrib.num_offset_meq_32--;
 		}
 		else
 		{
-			flt_rule_entry.rule.eq_attrib.num_offset_meq_128++;
-			if(flt_rule_entry.rule.eq_attrib.num_offset_meq_128 <= IPA_IPFLTR_NUM_MEQ_128_EQNS)
+			if (flt_rule_entry.rule.eq_attrib.num_offset_meq_128 < IPA_IPFLTR_NUM_MEQ_128_EQNS)
 			{
+				flt_rule_entry.rule.eq_attrib.num_offset_meq_128++;
 				eq_index = flt_rule_entry.rule.eq_attrib.num_offset_meq_128 - 1;
 #ifdef FEATURE_IPA_V3
 				if(eq_index == 0)
@@ -3382,21 +3379,21 @@
 					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<4);
 				}
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 0)
-					= prefix[IPA_IP_v6].v6Mask[3];
+						= prefix[IPA_IP_v6].v6Mask[3];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4)
-					= prefix[IPA_IP_v6].v6Mask[2];
+						= prefix[IPA_IP_v6].v6Mask[2];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8)
-					= prefix[IPA_IP_v6].v6Mask[1];
+						= prefix[IPA_IP_v6].v6Mask[1];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 12)
-					= prefix[IPA_IP_v6].v6Mask[0];
+						= prefix[IPA_IP_v6].v6Mask[0];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 0)
-					= prefix[IPA_IP_v6].v6Addr[3];
+						= prefix[IPA_IP_v6].v6Addr[3];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 4)
-					= prefix[IPA_IP_v6].v6Addr[2];
+						= prefix[IPA_IP_v6].v6Addr[2];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8)
-					= prefix[IPA_IP_v6].v6Addr[1];
+						= prefix[IPA_IP_v6].v6Addr[1];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 12)
-					= prefix[IPA_IP_v6].v6Addr[0];
+						= prefix[IPA_IP_v6].v6Addr[0];
 #else
 				if(eq_index == 0)
 				{
@@ -3407,24 +3404,24 @@
 					flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<10);
 				}
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 0)
-					= prefix[IPA_IP_v6].v6Mask[0];
+						= prefix[IPA_IP_v6].v6Mask[0];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 4)
-					= prefix[IPA_IP_v6].v6Mask[1];
+						= prefix[IPA_IP_v6].v6Mask[1];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 8)
-					= prefix[IPA_IP_v6].v6Mask[2];
+						= prefix[IPA_IP_v6].v6Mask[2];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].mask + 12)
-					= prefix[IPA_IP_v6].v6Mask[3];
+						= prefix[IPA_IP_v6].v6Mask[3];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 0)
-					= prefix[IPA_IP_v6].v6Addr[0];
+						= prefix[IPA_IP_v6].v6Addr[0];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 4)
-					= prefix[IPA_IP_v6].v6Addr[1];
+						= prefix[IPA_IP_v6].v6Addr[1];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 8)
-					= prefix[IPA_IP_v6].v6Addr[2];
+						= prefix[IPA_IP_v6].v6Addr[2];
 				*(uint32_t *)(flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].value + 12)
-					= prefix[IPA_IP_v6].v6Addr[3];
+						= prefix[IPA_IP_v6].v6Addr[3];
 #endif
 				flt_rule_entry.rule.eq_attrib.offset_meq_128[eq_index].offset = 8;
-		}
+			}
 			else
 			{
 				IPACMERR("Run out of MEQ128 equation.\n");
diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp
index 347cb2e..666ee10 100644
--- a/ipacm/src/IPACM_Wlan.cpp
+++ b/ipacm/src/IPACM_Wlan.cpp
@@ -550,7 +550,7 @@
 		if(ipa_interface_index == ipa_if_num)
 		{
 			IPACMDBG_H("Received IPA_DOWNSTREAM_ADD event.\n");
-			if(is_downstream_set[data->prefix.iptype] == false)
+			if(data->prefix.iptype < IPA_IP_MAX && is_downstream_set[data->prefix.iptype] == false)
 			{
 				IPACMDBG_H("Add downstream for IP iptype %d.\n", data->prefix.iptype);
 				is_downstream_set[data->prefix.iptype] = true;