1.已把空指针和防护都补上了:创建消息失败直接返回并删除 action;spooling/发送/序列化都会跳过空消息并记录错误,避免再因 m_pSendMessage 为空导致崩溃或写出坏缓存。
已修改2个文件
105 ■■■■ 文件已修改
SourceCode/Bond/Servo/HsmsAction.cpp 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsAction.cpp
@@ -9,6 +9,7 @@
    m_nTimeout = 45;
    m_nResponseTime = 0;
    m_pContext = NULL;
    m_pSendMessage = NULL;
    m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
}
@@ -19,6 +20,7 @@
    m_nTimeout = nTimeout;
    m_nResponseTime = 0;
    m_pContext = NULL;
    m_pSendMessage = NULL;
    m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
}
@@ -41,6 +43,10 @@
    m_bNeedWaitReply = FALSE;
    m_nTimeout = 45;
    m_nResponseTime = 0;
    if (m_pSendMessage != NULL) {
        HSMS_Destroy1Message(m_pSendMessage);
        m_pSendMessage = NULL;
    }
    ::ResetEvent(m_hEvent);
}
@@ -73,6 +79,9 @@
void CHsmsAction::setSendMessage(IMessage* pMessage)
{
    if (m_pSendMessage != NULL && m_pSendMessage != pMessage) {
        HSMS_Destroy1Message(m_pSendMessage);
    }
    m_pSendMessage = pMessage;
}
@@ -110,12 +119,15 @@
int CHsmsAction::serialize(char* pszBuffer, int nBufferSize)
{
    int index = 0;
    if (m_pSendMessage == NULL) {
        return 0;
    }
    if (pszBuffer == nullptr) {
        index += sizeof(int);
        index += sizeof(m_nTimeout);
        index += sizeof(int);
        index += sizeof(BOOL);
        index += m_pSendMessage->serialize(pszBuffer, nBufferSize);
        index += m_pSendMessage->serialize(nullptr, 0);
        return index;
    }
@@ -157,7 +169,13 @@
    memcpy(&m_bNeedWaitReply, &pszBuffer[index], sizeof(BOOL));
    index += sizeof(BOOL);
    HSMS_Create1Message(m_pSendMessage, 1, 1 | REPLY, 1, 1);
    if (m_pSendMessage != NULL) {
        HSMS_Destroy1Message(m_pSendMessage);
        m_pSendMessage = NULL;
    }
    if (HSMS_Create1Message(m_pSendMessage, 1, 1 | REPLY, 1, 1) != 0 || m_pSendMessage == NULL) {
        return -1;
    }
    int nRet = m_pSendMessage->unserialize(&pszBuffer[index], nBufferSize - index);
    if (nRet < 0) return nRet;
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -1909,7 +1909,16 @@
    if (pszBuffer == nullptr) {
        index += sizeof(int);
        for (auto item : m_listActionSpooling) {
            index += item->serialize(pszBuffer, nBufferSize);
            if (item == nullptr || item->getSendMessage() == nullptr) {
                LOGE("<HSMS>skip spooling item: null send message");
                continue;
            }
            int nRet = item->serialize(nullptr, 0);
            if (nRet <= 0) {
                LOGE("<HSMS>skip spooling item: serialize failed");
                continue;
            }
            index += nRet;
        }
        index += calcSpoolCfgSize();
@@ -1917,15 +1926,31 @@
        return index;
    }
    else {
        int nTemp, nRet;
        int nTemp = 0;
        int nRet = 0;
        nTemp = (int)m_listActionSpooling.size();
        for (auto item : m_listActionSpooling) {
            if (item == nullptr || item->getSendMessage() == nullptr) {
                continue;
            }
            if (item->serialize(nullptr, 0) > 0) {
                ++nTemp;
            }
        }
        memcpy(&pszBuffer[index], &nTemp, sizeof(int));
        index += sizeof(int);
        for (auto item : m_listActionSpooling) {
            if (item == nullptr || item->getSendMessage() == nullptr) {
                LOGE("<HSMS>skip spooling item: null send message");
                continue;
            }
            nRet = item->serialize(&pszBuffer[index], nBufferSize);
            if (nRet <= 0) break;
            if (nRet <= 0) {
                LOGE("<HSMS>skip spooling item: serialize failed");
                continue;
            }
            index += nRet;
        }
@@ -1971,7 +1996,10 @@
    for (int i = 0; i < nTemp; i++) {
        CHsmsAction* pAction = new CHsmsAction();
        nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index);
        if (nRet <= 0) break;
        if (nRet <= 0 || pAction->getSendMessage() == nullptr) {
            delete pAction;
            break;
        }
        index += nRet;
        m_listActionSpooling.push_back(pAction);
    }
@@ -2052,6 +2080,11 @@
            Unlock();
            if (!selected) {
                IMessage* pMsg = pAction->getSendMessage();
                if (pMsg == NULL) {
                    LOGE("<HSMS>spooling drop: null send message");
                    delete pAction;
                    continue;
                }
                uint8_t streamId = 0;
                uint8_t functionId = 0;
                if (pMsg && pMsg->getHeader()) {
@@ -2073,9 +2106,14 @@
            if (pAction->isNeedWaitReply()) {
                // 如果需要等待回复
                IMessage* pMessage = pAction->getSendMessage();
                if (pMessage == NULL) {
                    LOGE("<HSMS>drop action: null send message");
                    delete pAction;
                    continue;
                }
                Lock();
                m_pActiveAction = pAction;
                IMessage* pMessage = pAction->getSendMessage();
                Unlock();
                ASSERT(pMessage);
@@ -2099,9 +2137,14 @@
                Unlock();
            }
            else {
                IMessage* pMessage = pAction->getSendMessage();
                if (pMessage == NULL) {
                    LOGE("<HSMS>drop action: null send message");
                    delete pAction;
                    continue;
                }
                Lock();
                m_listActionSent.push_back(pAction);
                IMessage* pMessage = pAction->getSendMessage();
                Unlock();
                ASSERT(pMessage);
@@ -2144,11 +2187,15 @@
    Lock();
    CHsmsAction* pAction = new CHsmsAction(ACTION_HELLO, FALSE, m_nActionTimeout);
    m_listAction.push_back(pAction);
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte);
    ASSERT(pMessage);
    if (HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) {
        LOGE("<HSMS>S1F1 create message failed");
        delete pAction;
        Unlock();
        return ER_CREATED_MESSAGE;
    }
    pAction->setSendMessage(pMessage);
    m_listAction.push_back(pAction);
    SetEvent(m_hCimWorkEvent);
    Unlock();
@@ -3536,8 +3583,12 @@
    CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout);
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte);
    ASSERT(pMessage);
    if (HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) {
        LOGE("<HSMS>S5F1 create message failed");
        delete pAction;
        Unlock();
        return ER_CREATED_MESSAGE;
    }
    ISECS2Item* pItem = pMessage->getBody();
    pItem->addBinaryItem(szALCD, 1, "ALCD");
    pItem->addU4Item(ALID, "ALID");
@@ -3580,8 +3631,12 @@
    Lock();
    CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
    ASSERT(pMessage);
    if (HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte) != 0 || pMessage == NULL) {
        LOGE("<HSMS>S6F11 create message failed");
        delete pAction;
        Unlock();
        return ER_CREATED_MESSAGE;
    }
    ISECS2Item* pItem = pMessage->getBody();
    // pItem->addU2Item(++DATAID, "DATAID");        // 根据别的日志显示DATAID恒为0,所以我们先照使用0
    pItem->addU2Item(0, "DATAID");