espressif / esp-mqtt

ESP32 mqtt component
Apache License 2.0
603 stars 255 forks source link

is_valid_mqtt_msg 处理方式存在bug (IDFGH-1891) #132

Closed MGDG closed 5 years ago

MGDG commented 5 years ago

mqtt_client.c 中的 is_valid_mqtt_msg 函数

{
    ESP_LOGD(TAG, "pending_id=%d, pending_msg_count = %d", client->mqtt_state.pending_msg_id, client->mqtt_state.pending_msg_count);
    if (client->mqtt_state.pending_msg_count == 0) {
        return false;
    }
    if (outbox_delete(client->outbox, msg_id, msg_type) == ESP_OK) {
        client->mqtt_state.pending_msg_count --;
        return true;
    }
    if (client->mqtt_state.pending_msg_type == msg_type && client->mqtt_state.pending_msg_id == msg_id) {
        client->mqtt_state.pending_msg_count --;
        return true;
    }

    return false;
}

其中

    if (client->mqtt_state.pending_msg_type == msg_type && client->mqtt_state.pending_msg_id == msg_id) {
        client->mqtt_state.pending_msg_count --;
        return true;
    }

应当去掉。 一条消息已经应答过(outbox_delete中被删了)的又被应答一次(发生在网速慢的情况下,消息重发收到多次应答),则会进入这条语句,导致pending_msg_count数量减少,后面需要应答的消息(在之前的消息还没被应答的情况下又发送的)可能就会因为pending_msg_count为0而无法从outbox中删除,从而不停地进行重发