Procházet zdrojové kódy

qcacmn: Regdb Kernel panic fixed

Some countries have no reg rules. Check is added to avoid
NULL pointer dereference in cur_reg_rule.

Change-Id: I1840ca85121f0f61abab8fcf288fdde6a9ca22c5
CRs-Fixed: 2002892
Baila, Shashikala Prabhu před 8 roky
rodič
revize
ae499840fc
1 změnil soubory, kde provedl 23 přidání a 5 odebrání
  1. 23 5
      umac/regulatory/core/src/reg_db_parser.c

+ 23 - 5
umac/regulatory/core/src/reg_db_parser.c

@@ -25,6 +25,7 @@
 #include <qdf_types.h>
 #include "reg_db_parser.h"
 #include <qdf_mem.h>
+#include "reg_priv.h"
 
 QDF_STATUS reg_is_country_code_valid(uint8_t alpha[3])
 {
@@ -79,6 +80,10 @@ QDF_STATUS reg_regrules_assign(uint8_t dmn_id_2g,
 		r_r_5g++;
 	}
 
+	if ((r_r_2g == reg_info->reg_rules_2g_ptr) &&
+			(r_r_5g == reg_info->reg_rules_5g_ptr))
+		return QDF_STATUS_E_FAILURE;
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -191,6 +196,7 @@ static inline QDF_STATUS reg_get_reginfo_form_country_code_and_regdmn_pair(
 	uint8_t rule_size_2g, rule_size_5g;
 	uint8_t dmn_id_5g, dmn_id_2g;
 	uint8_t ant_gain_2g, ant_gain_5g;
+	QDF_STATUS err;
 
 	dmn_id_5g = g_reg_dmn_pairs[regdmn_pair].dmn_id_5g;
 	dmn_id_2g = g_reg_dmn_pairs[regdmn_pair].dmn_id_2g;
@@ -231,9 +237,15 @@ static inline QDF_STATUS reg_get_reginfo_form_country_code_and_regdmn_pair(
 			qdf_mem_malloc((reg_info->num_5g_reg_rules) *
 					sizeof(struct cur_reg_rule));
 
-		reg_regrules_assign(dmn_id_2g, dmn_id_5g,
+		err = reg_regrules_assign(dmn_id_2g, dmn_id_5g,
 				ant_gain_2g, ant_gain_5g, reg_info);
 
+		if (err == QDF_STATUS_E_FAILURE) {
+			reg_err("%s : No rule found for country index = %d regdmn_pair = %d\n",
+					__func__, country_index, regdmn_pair);
+			return QDF_STATUS_E_FAILURE;
+		}
+
 		return QDF_STATUS_SUCCESS;
 	} else if (!(((rule_size_2g + rule_size_5g) >=
 				regdomains_2g[dmn_id_2g].num_reg_rules +
@@ -250,6 +262,7 @@ static inline QDF_STATUS reg_get_reginfo_form_regdmn_pair(
 	uint8_t rule_size_2g, rule_size_5g;
 	uint8_t dmn_id_5g, dmn_id_2g;
 	uint8_t ant_gain_2g, ant_gain_5g;
+	QDF_STATUS err;
 
 	dmn_id_5g = g_reg_dmn_pairs[regdmn_pair].dmn_id_5g;
 	dmn_id_2g = g_reg_dmn_pairs[regdmn_pair].dmn_id_2g;
@@ -287,8 +300,13 @@ static inline QDF_STATUS reg_get_reginfo_form_regdmn_pair(
 			qdf_mem_malloc((reg_info->num_5g_reg_rules) *
 					sizeof(struct cur_reg_rule));
 
-		reg_regrules_assign(dmn_id_2g, dmn_id_5g,
+		err = reg_regrules_assign(dmn_id_2g, dmn_id_5g,
 			ant_gain_2g, ant_gain_5g, reg_info);
+		if (err == QDF_STATUS_E_FAILURE) {
+			reg_err("%s : No rule found for regdmn_pair = %d\n",
+					__func__, regdmn_pair);
+			return QDF_STATUS_E_FAILURE;
+		}
 
 		return QDF_STATUS_SUCCESS;
 	} else if (!(((rule_size_2g + rule_size_5g) >=
@@ -305,13 +323,13 @@ QDF_STATUS reg_get_cur_reginfo(struct cur_regulatory_info *reg_info,
 		uint16_t regdmn_pair)
 {
 	if ((country_index != (uint16_t)(-1)) &&
-		(regdmn_pair != (uint16_t)(-1)))
-		reg_get_reginfo_form_country_code_and_regdmn_pair(
+			(regdmn_pair != (uint16_t)(-1)))
+		return reg_get_reginfo_form_country_code_and_regdmn_pair(
 				reg_info,
 				country_index,
 				regdmn_pair);
 	else if (regdmn_pair != (uint16_t)(-1))
-		reg_get_reginfo_form_regdmn_pair(
+		return reg_get_reginfo_form_regdmn_pair(
 				reg_info,
 				regdmn_pair);
 	else