diff --git a/src/dnode/src/dnodeMgmt.c b/src/dnode/src/dnodeMgmt.c index e260e7ec81ddee56cfb624f719f3551028c211ed..d442b125861419ca56697e341e6d5b398846af14 100644 --- a/src/dnode/src/dnodeMgmt.c +++ b/src/dnode/src/dnodeMgmt.c @@ -414,15 +414,35 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) { dnodeProcessModuleStatus(pCfg->moduleStatus); dnodeUpdateDnodeCfg(pCfg); + dnodeUpdateMnodeInfos(pMnodes); taosTmrReset(dnodeSendStatusMsg, tsStatusInterval * 1000, NULL, tsDnodeTmr, &tsStatusTimer); } +static bool dnodeCheckMnodeInfos(SDMMnodeInfos *pMnodes) { + if (pMnodes->nodeNum <= 0 || pMnodes->nodeNum > 3) { + dError("invalid mnode infos, num:%d", pMnodes->nodeNum); + return false; + } + + for (int32_t i = 0; i < pMnodes->nodeNum; ++i) { + SDMMnodeInfo *pMnodeInfo = &pMnodes->nodeInfos[i]; + if (pMnodeInfo->nodeId <= 0 || strlen(pMnodeInfo->nodeEp) <= 5) { + dError("invalid mnode info:%d, nodeId:%d nodeEp:%s", pMnodeInfo->nodeId, pMnodeInfo->nodeEp); + return false; + } + } + + return true; +} + static void dnodeUpdateMnodeInfos(SDMMnodeInfos *pMnodes) { bool mnodesChanged = (memcmp(&tsDMnodeInfos, pMnodes, sizeof(SDMMnodeInfos)) != 0); bool mnodesNotInit = (tsDMnodeInfos.nodeNum == 0); if (!(mnodesChanged || mnodesNotInit)) return; + if (!dnodeCheckMnodeInfos(pMnodes)) return; + memcpy(&tsDMnodeInfos, pMnodes, sizeof(SDMMnodeInfos)); dPrint("mnode infos is changed, nodeNum:%d inUse:%d", tsDMnodeInfos.nodeNum, tsDMnodeInfos.inUse); for (int32_t i = 0; i < tsDMnodeInfos.nodeNum; i++) {