[automerger skipped] Merge "DO NOT MERGE - Merge RQ3A.210605.005" am: d83838d918 -s ours am: badb90b5e1 -s ours

am skip reason: Merged-In I329e495f244ca88a6614fab3556eb1267720d35f with SHA-1 65199c0c88 is already in history

Original change: https://android-review.googlesource.com/c/platform/hardware/qcom/wlan/+/1741198

Change-Id: I1ed6a70ff6b03fcbe174d5bc53aad63803835ea5
diff --git a/OWNERS b/OWNERS
index 36eb7f9..351212a 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,3 +1,2 @@
 etancohen@google.com
-kumaranand@google.com
-rpius@google.com
+arabawy@google.com
diff --git a/qcwcn/wifi_hal/llstats.cpp b/qcwcn/wifi_hal/llstats.cpp
index 407a6c3..50b8149 100644
--- a/qcwcn/wifi_hal/llstats.cpp
+++ b/qcwcn/wifi_hal/llstats.cpp
@@ -1151,10 +1151,19 @@
 
                         memset(pIfaceStat, 0, resultsBufSize);
                         if(mResultsParams.iface_stat) {
-                            memcpy ( pIfaceStat, mResultsParams.iface_stat,
-                                sizeof(wifi_iface_stat));
-                            free (mResultsParams.iface_stat);
-                            mResultsParams.iface_stat = pIfaceStat;
+                            if(resultsBufSize >= sizeof(wifi_iface_stat)) {
+                                memcpy ( pIfaceStat, mResultsParams.iface_stat,
+                                    sizeof(wifi_iface_stat));
+                                free (mResultsParams.iface_stat);
+                                mResultsParams.iface_stat = pIfaceStat;
+                            } else {
+                                ALOGE("%s: numPeers = %u, num_rates= %u, "
+                                      "either numPeers or num_rates is invalid",
+                                      __FUNCTION__,numPeers,num_rates);
+                                status = WIFI_ERROR_UNKNOWN;
+                                free(pIfaceStat);
+                                goto cleanup;
+                            }
                         }
                         wifi_peer_info *pPeerStats;
                         pIfaceStat->num_peers = numPeers;
diff --git a/qcwcn/wifi_hal/nan_ind.cpp b/qcwcn/wifi_hal/nan_ind.cpp
index f661ed3..1fe651d 100644
--- a/qcwcn/wifi_hal/nan_ind.cpp
+++ b/qcwcn/wifi_hal/nan_ind.cpp
@@ -346,6 +346,11 @@
             /* Populate receive discovery attribute from
                received TLV */
             idx = event->num_rx_discovery_attr;
+            if (idx < 0 || idx >= NAN_MAX_POSTDISCOVERY_LEN) {
+                ALOGE("NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE"
+                      " Incorrect index:%d >= %d", idx, NAN_MAX_POSTDISCOVERY_LEN);
+                break;
+            }
             ret = getNanReceivePostDiscoveryVal(outputTlv.value,
                                                 outputTlv.length,
                                                 &event->discovery_attr[idx]);
diff --git a/qcwcn/wifi_hal/wifi_hal.cpp b/qcwcn/wifi_hal/wifi_hal.cpp
index d64e3b8..f071dfc 100644
--- a/qcwcn/wifi_hal/wifi_hal.cpp
+++ b/qcwcn/wifi_hal/wifi_hal.cpp
@@ -1879,6 +1879,24 @@
 {
     hal_info *info = (hal_info *)handle;
 
+    /* In case of dynamic interface add/remove, interface handles need to be
+     * updated so that, interface specific APIs could be instantiated.
+     * Reload here to get interfaces which are dynamically added. */
+
+    if (info->num_interfaces > 0) {
+        for (int i = 0; i < info->num_interfaces; i++)
+            free(info->interfaces[i]);
+        free(info->interfaces);
+        info->interfaces = NULL;
+        info->num_interfaces = 0;
+    }
+
+    wifi_error ret = wifi_init_interfaces(handle);
+    if (ret != WIFI_SUCCESS) {
+        ALOGE("Failed to init interfaces while wifi_get_ifaces");
+        return ret;
+    }
+
     *interfaces = (wifi_interface_handle *)info->interfaces;
     *num = info->num_interfaces;
 
diff --git a/qcwcn/wifi_hal/wificonfig.cpp b/qcwcn/wifi_hal/wificonfig.cpp
index 8ab296a..c6ceb9d 100644
--- a/qcwcn/wifi_hal/wificonfig.cpp
+++ b/qcwcn/wifi_hal/wificonfig.cpp
@@ -360,12 +360,14 @@
 
     switch (scenario) {
         case WIFI_POWER_SCENARIO_VOICE_CALL:
-        case WIFI_POWER_SCENARIO_ON_HEAD_CELL_OFF:
         case WIFI_POWER_SCENARIO_ON_BODY_BT:
             bdf_file = QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_BDF0;
             break;
 
+        case WIFI_POWER_SCENARIO_ON_HEAD_CELL_OFF:
         case WIFI_POWER_SCENARIO_ON_HEAD_CELL_ON:
+        case WIFI_POWER_SCENARIO_ON_HEAD_HOTSPOT:
+        case WIFI_POWER_SCENARIO_ON_HEAD_HOTSPOT_MMW:
             bdf_file = QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_BDF1;
             break;
 
@@ -374,6 +376,11 @@
             break;
 
         case WIFI_POWER_SCENARIO_ON_BODY_CELL_ON:
+        case WIFI_POWER_SCENARIO_ON_BODY_CELL_ON_BT:
+        case WIFI_POWER_SCENARIO_ON_BODY_HOTSPOT:
+        case WIFI_POWER_SCENARIO_ON_BODY_HOTSPOT_BT:
+        case WIFI_POWER_SCENARIO_ON_BODY_HOTSPOT_MMW:
+        case WIFI_POWER_SCENARIO_ON_BODY_HOTSPOT_BT_MMW:
             bdf_file = QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_BDF3;
             break;