|
|
@@ -163,6 +163,10 @@ static void handle_api_settings(struct mg_connection *c, struct mg_http_message
|
|
|
const char *param = j_param->valuestring;
|
|
|
uint16_t value = (uint16_t)j_value->valueint;
|
|
|
|
|
|
+ /* Copy param string early - it points into req's memory which may be freed */
|
|
|
+ char param_copy[64];
|
|
|
+ snprintf(param_copy, sizeof(param_copy), "%s", param);
|
|
|
+
|
|
|
/* Map parameter name to register address */
|
|
|
uint16_t reg_addr = 0xFFFF;
|
|
|
const char *param_desc = "";
|
|
|
@@ -201,11 +205,11 @@ static void handle_api_settings(struct mg_connection *c, struct mg_http_message
|
|
|
|
|
|
/* Validate */
|
|
|
if (modbus_validate_setting(reg_addr, value, current_battery_type) != 0) {
|
|
|
- cJSON_Delete(req);
|
|
|
char err_msg[256];
|
|
|
snprintf(err_msg, sizeof(err_msg),
|
|
|
"{\"error\":\"Invalid value for %s (reg 0x%04X). Value %u out of range.\"}",
|
|
|
- param, reg_addr, value);
|
|
|
+ param_copy, reg_addr, value);
|
|
|
+ cJSON_Delete(req);
|
|
|
mg_http_reply(c, 400, "Content-Type: application/json\r\n", "%s", err_msg);
|
|
|
return;
|
|
|
}
|
|
|
@@ -228,17 +232,17 @@ static void handle_api_settings(struct mg_connection *c, struct mg_http_message
|
|
|
"{\"success\":true,\"device_addr\":%d,\"param\":\"%s\","
|
|
|
"\"param_desc\":\"%s\",\"reg_addr\":\"0x%04X\",\"value\":%d,"
|
|
|
"\"message\":\"写入成功\"}",
|
|
|
- dev_addr, param, param_desc, reg_addr, value);
|
|
|
+ dev_addr, param_copy, param_desc, reg_addr, value);
|
|
|
mg_http_reply(c, 200, "Content-Type: application/json\r\nAccess-Control-Allow-Origin: *\r\n",
|
|
|
"%s", resp);
|
|
|
printf("[WEB] Settings write success: dev %d, %s (0x%04X) = %u\n",
|
|
|
- dev_addr, param, reg_addr, value);
|
|
|
+ dev_addr, param_copy, reg_addr, value);
|
|
|
} else {
|
|
|
char resp[256];
|
|
|
snprintf(resp, sizeof(resp),
|
|
|
"{\"success\":false,\"error\":\"Modbus写入失败,请检查设备连接\","
|
|
|
"\"device_addr\":%d,\"param\":\"%s\"}",
|
|
|
- dev_addr, param);
|
|
|
+ dev_addr, param_copy);
|
|
|
mg_http_reply(c, 500, "Content-Type: application/json\r\n", "%s", resp);
|
|
|
}
|
|
|
}
|