Просмотр исходного кода

fix: airlink,ble,bt_resp_cb处理回调数据时,应该malloc而非使用局部变量, 因为目标回调函数会执行free操作

Wendal Chen 9 месяцев назад
Родитель
Сommit
5abb6baeaf
1 измененных файлов с 11 добавлено и 9 удалено
  1. 11 9
      components/airlink/src/exec/luat_airlink_cmd_exec_bluetooth.c

+ 11 - 9
components/airlink/src/exec/luat_airlink_cmd_exec_bluetooth.c

@@ -61,24 +61,26 @@ int luat_airlink_cmd_exec_bt_resp_cb(luat_airlink_cmd_t *cmd, void *userdata) {
         uint32_t tmp = 0;
         memcpy(&tmp, msg->data, 4);
         luat_ble_event_t event = (luat_ble_event_t)tmp;
-        luat_ble_param_t param = {0};
-        memcpy(&param, msg->data + 4, sizeof(luat_ble_param_t));
+        luat_ble_param_t* param = luat_heap_malloc(sizeof(luat_ble_param_t));
+        memcpy(param, msg->data + 4, sizeof(luat_ble_param_t));
         // LLOGD("收到bt event %d %d", event, cmd->len - sizeof(luat_drv_ble_msg_t));
+        param->write_req.value = NULL;
+        param->adv_req.data = NULL;
 
         // 把能处理的先尝试处理一下
-        if (event == LUAT_BLE_EVENT_WRITE && param.write_req.value_len) {
-            param.write_req.value = luat_heap_malloc(param.write_req.value_len);
-            memcpy(param.write_req.value, msg->data + 4 + sizeof(luat_ble_param_t), param.write_req.value_len);
+        if (event == LUAT_BLE_EVENT_WRITE && param->write_req.value_len) {
+            param->write_req.value = luat_heap_malloc(param->write_req.value_len);
+            memcpy(param->write_req.value, msg->data + 4 + sizeof(luat_ble_param_t), param->write_req.value_len);
         }
         // else if (event == LUAT_BLE_EVENT_READ && param.read_req.len) {
         //     param.read_req.value = luat_heap_malloc(param.read_req.len);
         //     memcpy(param.read_req.value, msg->data + 4 + sizeof(luat_ble_param_t), param.read_req.len);
         // }
-        else if (event == LUAT_BLE_EVENT_SCAN_REPORT && param.adv_req.data_len) {
-            param.adv_req.data = luat_heap_malloc(param.adv_req.data_len);
-            memcpy(param.adv_req.data, msg->data + 4 + sizeof(luat_ble_param_t), param.adv_req.data_len);
+        else if (event == LUAT_BLE_EVENT_SCAN_REPORT && param->adv_req.data_len) {
+            param->adv_req.data = luat_heap_malloc(param->adv_req.data_len);
+            memcpy(param->adv_req.data, msg->data + 4 + sizeof(luat_ble_param_t), param->adv_req.data_len);
         }
-        g_drv_ble_cb(NULL, event, &param);
+        g_drv_ble_cb(NULL, event, param);
         return 0;
     }
     return 0;