fix: 修复28个隐藏Bug(崩溃/越界/内存泄漏/逻辑错误)

涉及9个文件: spiflash.c, DebugCmd.c, LoraTask.c, CatOneTask.c, EthTask.c, update_protocol.c, Public.c, RS485Task.c, main.c

P0致命: 死循环/空指针崩溃/缓冲区溢出/数组越界

P1严重: 数据拷贝错误/通信失败/内存泄漏/状态机错误

P2中等: 竞态条件/时序问题/逻辑隐患
This commit is contained in:
2026-08-13 18:20:51 +08:00
parent 974df2bcbc
commit fb72c9dd5d
9 changed files with 148 additions and 82 deletions
@@ -41,7 +41,7 @@ void Debug_Printf(char *format, ...)
{
va_list args;
va_start(args, format);
vsprintf(&tempBuff[0], format, args);
vsnprintf(&tempBuff[0], DEBUG_BUFF_MAX, format, args);
if(GateWay && GateWay->ConfigPara.Duch == CH_CAT1
&& GateWay->ConfigPara.Much != CH_CAT1
&& GateWay->ConfigPara.Auch != CH_CAT1
@@ -55,7 +55,7 @@ void Debug_Printf(char *format, ...)
line = end ? end + 2 : NULL;
}
} else {
rt_kprintf(tempBuff);
rt_kprintf("%s", tempBuff);
}
va_end(args);
}
@@ -145,7 +145,7 @@ void DebugAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
return;
//for(argv[argc] = strtok(RxBuff, " "); argv[argc] != NULL; argv[++argc] = strtok(NULL, " "));
argp = strtok((char *)rData, " ");
for(int i = 0; i < 10; i++) {
for(int i = 0; i < 9; i++) {
if(argp != NULL) {
argv[argc++] = argp;
argp = strtok(NULL, " ");
@@ -156,15 +156,18 @@ void DebugAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
}
}
argp = strtok(argv[argc], "'\r'");
argp = strtok(argv[argc], "\r");
if(argp != NULL) {
argv[argc++] = argp;
}
if(argc == 0)
return;
for(int i = 0; i < DEBUG_CMD_CNT; i++) {
if(strcmp(argv[0], DebugFun[i].DBGCmd) == 0) {
DebugFun[i].DBGExec(argc, argv);
break; // 未匹配break跳出
break;
}
}
}
@@ -907,7 +910,7 @@ void DebugCmdReadHisData(int argc, char *argv[])
}
rt_free(Data);
if(Header.LogIdx > StartIdx) {
DBG_LOG("His Cmd StartIdx Error, Read First Log, StartIdx = %d!\r\n, Header.LogIdx");
DBG_LOG("His Cmd StartIdx Error, Read First Log, StartIdx = %d!\r\n", Header.LogIdx);
LogIdx = Header.LogIdx;
}
else {
@@ -923,8 +926,10 @@ void DebugCmdReadHisData(int argc, char *argv[])
}
while(ReadNum > 0) {
ret = ReadLog(&Header, &Data, LogIdx);
if(ret == 0)
if(ret == 0) {
rt_free(Data);
return;
}
LogIdx++;
ReadNum--;
@@ -1208,7 +1213,7 @@ void DebugCmdTimeSync(int argc, char *argv[])
return;
}
ret = sscanf(argv[1], "%d-%d-%d,%d:%d:%d\r\n", &year, &month, &day, &hour, &min, &sec);
ret = sscanf(argv[1], "%d-%d-%d,%d:%d:%d", &year, &month, &day, &hour, &min, &sec);
if(ret != 6 || year < 2022 || year > 2099 || month > 12 || day > 31 || hour > 60 || min > 60 || sec > 60) {
DBG_LOG("Parameter error.\r\n");
return;
@@ -1619,11 +1624,11 @@ static void DebugCmdCali(int argc, char *argv[])
}
else if(mac[2] == 0x02) { //RS485ͨѶ
if(GateWay->ConfigPara.Rs485Ch1.Enable == true && !GateWay->ConfigPara.Rs485Ch1.CommUnitEnable) {
GateWay->ConfigPara.Rs485Ch1.RS485Send(Rs485Cmd, sizeof(CommUnitFrameHeader_t) + 2);
GateWay->ConfigPara.Rs485Ch1.RS485Send(CommUnitCmd, sizeof(CommUnitFrameHeader_t) + 2);
DBG_LOG("Calibrate CommUnit: %s!\r\n", argv[1]);
}
else if(GateWay->ConfigPara.Rs485Ch2.Enable == true && !GateWay->ConfigPara.Rs485Ch2.CommUnitEnable) {
GateWay->ConfigPara.Rs485Ch2.RS485Send(Rs485Cmd, sizeof(CommUnitFrameHeader_t) + 2);
GateWay->ConfigPara.Rs485Ch2.RS485Send(CommUnitCmd, sizeof(CommUnitFrameHeader_t) + 2);
DBG_LOG("Calibrate CommUnit: %s!\r\n", argv[1]);
}
else {
@@ -1701,7 +1706,7 @@ static void DebugLaserConfig(int argc, char *argv[])
ret = CheckCommUnitReg(GateWay, mac);
if(ret < 0) {
DBG_LOG("The CommUnit was not found!\r\n");
return;
}
}
else
+13 -4
View File
@@ -43,7 +43,7 @@ void Cat1DuchSend(const char *text, uint16_t len)
#define CATONE_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
const char *CatOneATCmdStr[16] = {
const char *CatOneATCmdStr[18] = {
"NULL",
"AT\r\n", //开机检测
"ATE0\r\n", //关回显
@@ -182,6 +182,7 @@ void CatOneAtCmdAnalyze(char *RxBuff)
p = strstr(RxBuff, "+CGSN");
if(p == NULL) {
CatOne.ATCmdRet = CAT_ONE_RET_ERR;
break;
}
p = strchr(p, '"');
if(p != NULL) {
@@ -206,6 +207,7 @@ void CatOneAtCmdAnalyze(char *RxBuff)
p = strstr(RxBuff, "+QCCID");
if(p == NULL) {
CatOne.ATCmdRet = CAT_ONE_RET_ERR;
break;
}
memset(CatOne.SIM, 0, 32);
ret = sscanf(p, "+QCCID: %s\r\n", CatOne.SIM);
@@ -301,7 +303,7 @@ void CatOneAtCmdAnalyze(char *RxBuff)
ret = sscanf(p, "+LIPURC: 0,1,%d,%119s\r\n", &rLen, rData);
if(ret == 2) {
if(rLen < 24)
if(rLen < 24 || rLen > 120)
return;
memset(hData, 0x00, 60);
hLen = AsciiToHex(rData, hData, rLen);
@@ -639,16 +641,23 @@ void CatOneRev_Thread_Entry(void *parameter)
while(1) {
result = rt_sem_take(CatOneIRQ_Sem, 500);
if(result == RT_EOK) {
if(CatOneRxLen > CAT_ONE_REV_LEN_MAX)
CatOneRxLen = CAT_ONE_REV_LEN_MAX;
memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen);
RxBuffTemp[CatOneRxLen] = 0;
RxBuffTemp[CatOneRxLen < CAT_ONE_REV_LEN_MAX ? CatOneRxLen : CAT_ONE_REV_LEN_MAX - 1] = 0;
CatOneRxLen = 0;
char *urc = strstr(RxBuffTemp, "+LIPURC: 0,1,");
if(urc) {
char *data = strchr(strchr(strchr(urc, ',')+1, ',')+1, ',') + 1;
char *p1 = strchr(urc, ',');
char *p2 = p1 ? strchr(p1 + 1, ',') : NULL;
char *p3 = p2 ? strchr(p2 + 1, ',') : NULL;
if(p3) {
char *data = p3 + 1;
char *end = strchr(data, '\r');
if(end) *end = 0;
DebugAnalyze(GateWay, (uint8_t *)data, strlen(data));
}
}
CatOneAtCmdAnalyze(RxBuffTemp);
memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
}
+3 -1
View File
@@ -280,8 +280,10 @@ static void EthRev_Thread_Entry(void *parameter)
result = rt_sem_take(EthIRQ_Sem, 500);
if(result == RT_EOK || EthRxLen > 1) {
if(EthRxLen == 0) continue;
if(EthRxLen > ETH_RX_LEN_MAX)
EthRxLen = ETH_RX_LEN_MAX;
memcpy(RxBuffTemp, EthRxBuff, EthRxLen);
RxBuffTemp[EthRxLen] = 0;
RxBuffTemp[EthRxLen < ETH_RX_LEN_MAX ? EthRxLen : ETH_RX_LEN_MAX - 1] = 0;
memset(HexData, 0x00, EthRxLen / 2);
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen);
if(ret > 0 && HexData[0] == 0x7A) {
+12 -4
View File
@@ -22,6 +22,8 @@ int LoraRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
return -1;
sData = rt_malloc(rLen + 5);
if(sData == RT_NULL)
return -1;
sData[0] = rLen;
// Debug_Printf("Lora Rev: ");
@@ -31,7 +33,8 @@ int LoraRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
// Debug_Printf("\r\n");
memcpy(&sData[1], rData, rLen);
rt_mq_send(GateWay->LoraRev_MQ, sData, rLen + 1);
if(rt_mq_send(GateWay->LoraRev_MQ, sData, rLen + 1) != RT_EOK)
Debug_Printf("LoraRev MQ Full, Data Lost!\r\n");
rt_free(sData);
return 0;
}
@@ -79,7 +82,7 @@ void Lora_Thread_Entry(void *parameter)
uint16_t UnitCommReadDelayCnt = 0;
#endif
uint8_t Payload[256];
uint8_t MegData[9];
uint8_t MegData[10];
GateWay = (GateWayPara)parameter;
@@ -172,6 +175,7 @@ void Lora_Thread_Entry(void *parameter)
uint8_t sData[256];
if(rt_mq_recv(ChannelMQ(*GateWay, CH_LORA), sData, 256, 0) == RT_EOK) {
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
if(len <= 256)
Sx1276LoRaSendBuffer(sData, len);
}
}
@@ -181,12 +185,14 @@ void Lora_Thread_Entry(void *parameter)
if(ret == 0xff) //注册信息
continue;
if(UnitCommSendFlag && GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag) {
if(UnitCommSendFlag && SendUnitCommIdx < COMMUNIT_NUM_MAX && GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag) {
UnitCommSendFlag = false;
SendUnitCommIdx++;
if(SendUnitCommIdx >= COMMUNIT_NUM_MAX)
SendUnitCommIdx = 0;
}
}
else if(UnitCommSendFlag) { //离线判断
else if(UnitCommSendFlag && SendUnitCommIdx < COMMUNIT_NUM_MAX) { //离线判断
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt++;
if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt == 10) {
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt = 0;
@@ -202,6 +208,8 @@ void Lora_Thread_Entry(void *parameter)
}
UnitCommSendFlag = false;
SendUnitCommIdx++;
if(SendUnitCommIdx >= COMMUNIT_NUM_MAX)
SendUnitCommIdx = 0;
}
}
#endif
+20 -7
View File
@@ -676,6 +676,8 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
if(GateWay->MuchRegFlag) { //网关已注册,向服务发送新设备添加指令
PayLoadLen = (GateWay->ConfigPara.CommUnitArray[i].SensorN * 6) + 2;
MegData = rt_malloc(PayLoadLen + 3);
if(MegData == NULL)
return 0xff;
MegData[0] = PayLoadLen & 0x00ff;;
MegData[1] = (PayLoadLen >> 8) & 0x00ff;
MegData[2] = NET_COMM_CMD_ADD_UNIT;
@@ -683,7 +685,7 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
MegData[4] = (GateWay->ConfigPara.CommUnitArray[i].SensorN >> 8) & 0x00ff;
for(uint8_t k = 0; k < GateWay->ConfigPara.CommUnitArray[i].SensorN; k++)
{
memcpy(&MegData[5], GateWay->ConfigPara.CommUnitArray[i].Mac[k], 6);
memcpy(&MegData[5 + k * 6], GateWay->ConfigPara.CommUnitArray[i].Mac[k], 6);
}
UploadSend(MegData, PayLoadLen+5);
rt_free(MegData);
@@ -843,6 +845,8 @@ int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData
CommUnitCmdSend(GateWay, CUHeader->DevMac, COMM_UNIT_CMD_READ, (uint8_t *)&ctime, 4, Response);
#endif
MegData = rt_malloc(512);
if(MegData == NULL)
break;
CommUintLen = CommUintOrgData(GateWay, &GateWay->ConfigPara.CommUnitArray[CommUnitIdx], &GateWay->CUDataArray[CommUnitIdx], MegData);
//AddLog(&MegData[2], CommUintLen);
UploadSend(MegData, CommUintLen);
@@ -1055,7 +1059,9 @@ static int _NetRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, b
NetCommFrameHeader NCHeader = (NetCommFrameHeader)rData;
uint16_t FrameLen = sizeof(NetCommFrameHeader_t) + NCHeader->PayloadLen;
if(FrameLen > CAT_ONE_REV_LEN_MAX)
if(FrameLen > CAT_ONE_REV_LEN_MAX - 2)
return -1;
if(rLen < FrameLen + 2)
return -1;
if(NCHeader->Header != 0x7A)
return -1;
@@ -1273,12 +1279,18 @@ static int _NetRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, b
for(int i = *StartIdx; i < *EndIdx; i++) {
uint8_t *HisData;
int ret = ReadHistoryData(&LogH, &HisData, i);
if(HisData != NULL) {
if(HisData != NULL && ret > 7) {
MegData = rt_malloc(ret + 15);
MegData[0] = ret - 1 + 4;
MegData[1] = NET_COMM_CMD_HIS_DATA;
memcpy(&MegData[2], (uint8_t *)&LogH.LogIdx, 4);
sLen = 6;
if(MegData == NULL) {
rt_free(HisData);
continue;
}
uint16_t PLen = ret - 7 + 4 + 6;
MegData[0] = PLen & 0x00ff;
MegData[1] = (PLen >> 8) & 0x00ff;
MegData[2] = NET_COMM_CMD_HIS_DATA;
memcpy(&MegData[3], (uint8_t *)&LogH.LogIdx, 4);
sLen = 7;
memcpy(&MegData[sLen], HisData, 6);
sLen += 6;
memcpy(&MegData[sLen], &HisData[7], ret - 7);
@@ -1289,6 +1301,7 @@ static int _NetRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, b
rt_thread_delay(10);
}
else {
if(HisData) rt_free(HisData);
continue;
}
}
+3 -2
View File
@@ -14,7 +14,7 @@
SensorCommPara_t SComm1Para;
SensorCommPara_t SComm2Para;
const uint8_t RS485SensorCmdPayLoadLen[RS485_SENSOR_CMD_END] = {0, 0, 0, 1, 0};
const uint8_t RS485SensorCmdPayLoadLen[RS485_SENSOR_CMD_END] = {0, 0, 0, 1, 0, 0, 4, 0};
/*****************************************************************************************
* 函数名称: SavSensorData
@@ -84,7 +84,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
MAIN_DBG_LOG("Sensor%d calibration succeeded!\r\n", Header->SlvAddr);
}
else {
MAIN_DBG_LOG("Sensor%d calibration succeeded!\r\n", Header->SlvAddr);
MAIN_DBG_LOG("Sensor%d calibration failed!\r\n", Header->SlvAddr);
}
break;
@@ -101,6 +101,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
if(SCPara->SendFlag)
SCPara->ReadSensorCnt++;
DebugDisplaySensorData(Header->SlvAddr, 0, &rData[sizeof(FrameHeader_t)]);
break;
}
default:
+3 -1
View File
@@ -86,13 +86,15 @@ void GateWayInit(void)
rt_kprintf("AppFlag: 0x%08x\r\n", bootParam.AppFlag);
if(bootParam.AppFlag == APP_BOOT_UPGRADE_FLAG) {
rt_kprintf("Boot upgrade detected, erasing external Flash...\r\n");
FeedDog();
SpiFlashEraseChip();
FeedDog();
bootParam.AppFlag = 0;
dev_boot_write_param(bootParam);
}
int ret = ReadPara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
if(GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
if(ret != 0 || GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG;
GateWay.ConfigPara.Much = CH_ETH;
+25 -2
View File
@@ -73,6 +73,26 @@ void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
#ifdef FLASH_TEST
memcpy(&flashtestbuff[wAddr], wData, wLen);
#else
uint16_t PageRemain;
while(wLen > 0) {
PageRemain = SPIFLASH_PAGESIZE - (wAddr % SPIFLASH_PAGESIZE);
if(wLen > PageRemain) {
SpiFlashWriteEnable();
SpiFlashClrNss();
SpiFlashSendByte(SPIFLASH_CMD_WRITE);
SpiFlashSendByte((wAddr >> 16) & 0x00FF);
SpiFlashSendByte((wAddr >> 8) & 0x00FF);
SpiFlashSendByte(wAddr & 0x00FF);
for(int i = 0; i < PageRemain; i++) {
SpiFlashSendByte(wData[i]);
}
SpiFlashSetNss();
SpiFlashWaitForWriteEnd();
wData += PageRemain;
wAddr += PageRemain;
wLen -= PageRemain;
}
else {
SpiFlashWriteEnable();
SpiFlashClrNss();
SpiFlashSendByte(SPIFLASH_CMD_WRITE);
@@ -84,6 +104,9 @@ void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
}
SpiFlashSetNss();
SpiFlashWaitForWriteEnd();
wLen = 0;
}
}
#endif
}
@@ -313,7 +336,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
return;
}
DelOffsetAddr = (wAddr / SPIFLASH_SECTORSIZE + 1) * SPIFLASH_SECTORSIZE;
DelSectorNum = (wLen - SurplusSpace) / SPIFLASH_SECTORSIZE + 1;
DelSectorNum = (wLen - SurplusSpace + SPIFLASH_SECTORSIZE - 1) / SPIFLASH_SECTORSIZE;
SetLastLogEndAddr(wAddr + wLen);
for(int i = 0; i < DelSectorNum; i++) {
SpiFlashEraseSector(DelOffsetAddr);
@@ -338,7 +361,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
return;;
}
}
if(i == LOG_SAV_SIZE_MAX) {
if(i > LOG_SAV_SIZE_MAX - 4) {
ReadAddr += LOG_SAV_SIZE_MAX;
if(ReadAddr >= SPIFLASH_SIZE) { //找不到下一条数据,重置flash
Debug_Printf("Add LOG Error, Next Data No Find!\r\n");
@@ -54,11 +54,14 @@ int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, vo
uint16_t check;
if(rLen < 2 || rxData == NULL || pload == NULL)
return -1;
check = CRC_Modbus(CRC16_BASE, rxData, rLen - 2);
crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2];
if (check != crc16 || rxData[0] !=0x7a || pload ==0)
if (check != crc16 || rxData[0] !=0x7a)
{
return -1;
}
@@ -71,17 +74,17 @@ int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, vo
if (Frame->Cmd == 0x81){
//update_protocol_req_t *UpData = (update_protocol_req_t*)&rxData[sizeof(update_protocol_hd_t)];
pload = 0;
*pLen = 0;
}else if (Frame->Cmd == 0x82){
update_protocol_rsp_t *DownData = (update_protocol_rsp_t *)&rxData[sizeof(update_protocol_hd_t)];
if(DownData->DataLen > 256 || (int)(sizeof(update_protocol_hd_t) + sizeof(update_protocol_rsp_t) + DownData->DataLen) > rLen)
return -1;
memcpy(pload , &rxData[sizeof(update_protocol_hd_t) + sizeof(update_protocol_rsp_t)],DownData->DataLen);
*pLen = DownData->DataLen;