Clean up SetADV and ScanResp data memory leak.

Bug:18045480
Change-Id: Ic433f4aa26bd08e84c53c447be9d5278e16ebd55
diff --git a/btif/include/btif_gatt_multi_adv_util.h b/btif/include/btif_gatt_multi_adv_util.h
index 1175958..4b44a51 100644
--- a/btif/include/btif_gatt_multi_adv_util.h
+++ b/btif/include/btif_gatt_multi_adv_util.h
@@ -52,7 +52,6 @@
 
 typedef struct
 {
-    UINT8 inst_id;
     BOOLEAN is_scan_rsp;
     UINT8 client_if;
     UINT16 service_uuid_len;
@@ -78,9 +77,12 @@
         BOOLEAN gen_temp_instid);
 extern int btif_multi_adv_instid_for_clientif(int client_if);
 extern int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index);
-extern void btif_gattc_clear_clientif(int client_if);
-extern void btif_gattc_cleanup_inst_cb(int inst_id);
-extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb);
+extern void btif_gattc_clear_clientif(int client_if, BOOLEAN stop_timer);
+extern void btif_gattc_cleanup_inst_cb(int inst_id, BOOLEAN stop_timer);
+extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb,
+                                                    BOOLEAN stop_timer);
+// Free a buffer and reset *buf to NULL.
+extern void btif_gattc_cleanup(void** buf);
 extern BOOLEAN btif_gattc_copy_datacb(int arrindex, btif_adv_data_t *p_adv_data,
                                             BOOLEAN bInstData);
 extern void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
diff --git a/btif/src/btif_gatt_client.c b/btif/src/btif_gatt_client.c
index 3e0107f..084950d 100644
--- a/btif/src/btif_gatt_client.c
+++ b/btif/src/btif_gatt_client.c
@@ -660,6 +660,7 @@
         case BTA_GATTC_MULT_ADV_DATA_EVT:
          {
             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
+            btif_gattc_clear_clientif(p_btif_cb->client_if, FALSE);
             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_data_cb
                 , p_btif_cb->client_if
                 , p_btif_cb->status
@@ -670,7 +671,7 @@
         case BTA_GATTC_MULT_ADV_DIS_EVT:
         {
             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
-            btif_gattc_clear_clientif(p_btif_cb->client_if);
+            btif_gattc_clear_clientif(p_btif_cb->client_if, TRUE);
             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_disable_cb
                 , p_btif_cb->client_if
                 , p_btif_cb->status
@@ -680,7 +681,7 @@
 
         case BTA_GATTC_ADV_DATA_EVT:
         {
-            btif_gattc_cleanup_inst_cb(STD_ADV_INSTID);
+            btif_gattc_cleanup_inst_cb(STD_ADV_INSTID, FALSE);
             /* No HAL callback available */
             break;
         }
@@ -1092,7 +1093,7 @@
             break;
 
         case BTIF_GATTC_UNREGISTER_APP:
-            btif_gattc_clear_clientif(p_cb->client_if);
+            btif_gattc_clear_clientif(p_cb->client_if, TRUE);
             btif_gattc_decr_app_count();
             BTA_GATTC_AppDeregister(p_cb->client_if);
             break;
diff --git a/btif/src/btif_gatt_multi_adv_util.c b/btif/src/btif_gatt_multi_adv_util.c
index 3d7d96c..e03f2f1 100644
--- a/btif/src/btif_gatt_multi_adv_util.c
+++ b/btif/src/btif_gatt_multi_adv_util.c
@@ -485,7 +485,7 @@
      return true;
 }
 
-void btif_gattc_clear_clientif(int client_if)
+void btif_gattc_clear_clientif(int client_if, BOOLEAN stop_timer)
 {
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
     if (NULL == p_multi_adv_data_cb)
@@ -496,18 +496,20 @@
     {
         if (client_if == p_multi_adv_data_cb->clntif_map[i])
         {
-            btif_gattc_cleanup_inst_cb(p_multi_adv_data_cb->clntif_map[i+1]);
-            p_multi_adv_data_cb->clntif_map[i] = INVALID_ADV_INST;
-            p_multi_adv_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
-            BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i/2, client_if);
+            btif_gattc_cleanup_inst_cb(p_multi_adv_data_cb->clntif_map[i+1], stop_timer);
+            if (stop_timer)
+            {
+                p_multi_adv_data_cb->clntif_map[i] = INVALID_ADV_INST;
+                p_multi_adv_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
+                BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i/2, client_if);
+            }
             break;
         }
     }
 }
 
-void btif_gattc_cleanup_inst_cb(int inst_id)
+void btif_gattc_cleanup_inst_cb(int inst_id, BOOLEAN stop_timer)
 {
-    int cbindex = 0;
     // Check for invalid instance id
     if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
         return;
@@ -516,39 +518,33 @@
     if (NULL == p_multi_adv_data_cb)
         return;
 
-    if (inst_id > 0)
-    {
-        cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
-        if (cbindex < 0)
-            return;
-    } else {
-        if (STD_ADV_INSTID == inst_id)
-          cbindex = STD_ADV_INSTID;
-    }
+    int cbindex = (STD_ADV_INSTID == inst_id) ?
+        STD_ADV_INSTID : btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
+    if (cbindex < 0) return;
 
-    if (inst_id != INVALID_ADV_INST)
-    {
-        BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
-        btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
-        p_multi_adv_data_cb->inst_cb[cbindex].inst_id = INVALID_ADV_INST;
-    }
+    BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
+    btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex], stop_timer);
 }
 
-void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
+void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb,
+                                             BOOLEAN stop_timer)
 {
     if (p_multi_inst_cb == NULL)
         return;
 
     // Discoverability timer cleanup
-    if (p_multi_inst_cb->tle_limited_timer.in_use)
-        btu_stop_timer_oneshot(&p_multi_inst_cb->tle_limited_timer);
+    if (stop_timer)
+    {
+        if (p_multi_inst_cb->tle_limited_timer.in_use)
+            btu_stop_timer_oneshot(&p_multi_inst_cb->tle_limited_timer);
+        p_multi_inst_cb->tle_limited_timer.in_use = 0;
+    }
 
     // Manufacturer data cleanup
     if (p_multi_inst_cb->data.p_manu != NULL)
     {
-        if (p_multi_inst_cb->data.p_manu->p_val != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_manu->p_val);
-        GKI_freebuf(p_multi_inst_cb->data.p_manu);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_manu->p_val);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_manu);
     }
 
     // Proprietary data cleanup
@@ -559,58 +555,56 @@
         while (i++ != p_multi_inst_cb->data.p_proprietary->num_elem
             && p_elem)
         {
-            if (p_elem->p_val != NULL)
-                GKI_freebuf(p_elem->p_val);
+            btif_gattc_cleanup((void**) &p_elem->p_val);
             ++p_elem;
         }
 
-        if (p_multi_inst_cb->data.p_proprietary->p_elem != NULL)
-            GKI_freebuf(p_multi_inst_cb->data.p_proprietary->p_elem);
-        GKI_freebuf(p_multi_inst_cb->data.p_proprietary);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_proprietary->p_elem);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_proprietary);
     }
 
     // Service list cleanup
     if (p_multi_inst_cb->data.p_services != NULL)
     {
-        if (p_multi_inst_cb->data.p_services->p_uuid != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_services->p_uuid);
-        GKI_freebuf(p_multi_inst_cb->data.p_services);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_services->p_uuid);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_services);
     }
 
     // Service data cleanup
     if (p_multi_inst_cb->data.p_service_data != NULL)
     {
-        if (p_multi_inst_cb->data.p_service_data->p_val != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_service_data->p_val);
-        GKI_freebuf(p_multi_inst_cb->data.p_service_data);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_service_data->p_val);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_service_data);
     }
 
-    if (p_multi_inst_cb->data.p_services_128b != NULL)
-        GKI_freebuf(p_multi_inst_cb->data.p_services_128b);
+    btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_services_128b);
 
     if (p_multi_inst_cb->data.p_service_32b != NULL)
     {
-        if (p_multi_inst_cb->data.p_service_32b->p_uuid != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_service_32b->p_uuid);
-        GKI_freebuf(p_multi_inst_cb->data.p_service_32b);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_service_32b->p_uuid);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_service_32b);
     }
 
     if (p_multi_inst_cb->data.p_sol_services != NULL)
     {
-        if (p_multi_inst_cb->data.p_sol_services->p_uuid != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_sol_services->p_uuid);
-        GKI_freebuf(p_multi_inst_cb->data.p_sol_services);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_sol_services->p_uuid);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_sol_services);
     }
 
     if (p_multi_inst_cb->data.p_sol_service_32b != NULL)
     {
-        if (p_multi_inst_cb->data.p_sol_service_32b->p_uuid != NULL)
-           GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b->p_uuid);
-        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_sol_service_32b->p_uuid);
+        btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_sol_service_32b);
     }
 
-    if (p_multi_inst_cb->data.p_sol_service_128b != NULL)
-        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
+    btif_gattc_cleanup((void**) &p_multi_inst_cb->data.p_sol_service_128b);
+}
+
+void btif_gattc_cleanup(void** buf)
+{
+   if (NULL == *buf) return;
+   GKI_freebuf(*buf);
+   *buf = NULL;
 }
 
 void btif_multi_adv_timer_ctrl(int client_if, TIMER_CBACK cb)