RTU/mimo/plan/libtask缺陷修复计划.md

3.7 KiB
Raw Blame History

libtask 缺陷修复计划

For agentic workers: 此计划列出 libtask 事件和消息队列子系统的已知缺陷修复步骤。

目标: 修复 4 个缺陷 — use-after-free ×2、AND 位测试陷阱、cond_signal 稳健性

涉及文件: 仅 src/public/libtask/src/myTask.c


Task 1: 修复 task_event_destroy use-after-free

文件: src/public/libtask/src/myTask.c:106-131

  • Step 1: 修改 task_event_destroy

free(p) 后访问 p->name 改为先保存到栈变量:

int task_event_destroy(stru_task_event_t p_event)
{
    if(!p_event)
    {
        LOG_E("task_event_destroy error, p_event is NULL");
        return -1;
    }

    stru_task_event *p = (stru_task_event *)p_event;

    pthread_mutex_lock(&p->mutex);
    p->ref_count--;
    if(p->ref_count > 0)
    {
        pthread_mutex_unlock(&p->mutex);
        return 0;
    }

    pthread_mutex_unlock(&p->mutex);
    pthread_mutex_destroy(&p->mutex);
    pthread_cond_destroy(&p->cond);

    LOG_I("task_event_destroy success, name:%s", p->name);

    free(p);
    return 0;
}

改动: free(p) 下移到 LOG_I 之后。

  • Step 2: 编译验证
./release/build.sh

预期: 编译通过,零错误零警告。


Task 2: 修复 task_msg_queue_destroy use-after-free

文件: src/public/libtask/src/myTask.c:317-343

  • Step 1: 修改 task_msg_queue_destroy

同样将 free(p) 放到 LOG_I 之后:

int task_msg_queue_destroy(stru_task_msg_queue_t p_queue)
{
    if(!p_queue)
    {
        LOG_E("task_msg_queue_destroy error, p_queue is NULL");
        return -1;
    }
    
    stru_task_msg_queue *p = (stru_task_msg_queue *)p_queue;

    pthread_mutex_lock(&p->mutex);
    p->ref_count--;
    if(p->ref_count > 0)
    {
        pthread_mutex_unlock(&p->mutex);
        return 0;
    }

    pthread_mutex_unlock(&p->mutex);
    pthread_mutex_destroy(&p->mutex);
    pthread_cond_destroy(&p->cond);
    free(p->buffer);

    LOG_I("task_msg_queue_destroy success, name:%s", p->name);

    free(p);
    return 0;
}
  • Step 2: 编译验证
./release/build.sh

预期: 编译通过。


Task 3: 修复 task_event_recv AND 检查用 == 而非位测试

文件: src/public/libtask/src/myTask.c:182

  • Step 1: 修改 AND 条件判断

将第 182 行从 == 改为 &

        if(opt & TASK_EVENT_FLAG_AND)
        {
  • Step 2: 编译验证
./release/build.sh

预期: 编译通过。


Task 4: task_event_send 改用 cond_broadcast

文件: src/public/libtask/src/myTask.c:145

  • Step 1: 修改 signal 为 broadcast

将第 145 行:

    pthread_cond_signal(&p->cond);

改为:

    pthread_cond_broadcast(&p->cond);
  • Step 2: 编译验证
./release/build.sh

预期: 编译通过。


Task 5: 最终验证

  • Step 1: 全量编译
./release/build.sh

预期: Build complete,零错误零警告。

  • Step 2: 更新分析文档

mimo/工程/libtask模块分析.md 的缺点表中更新:标记 use-after-free 已修复、AND 位测试已修复。


未纳入修复的已知问题(调用方侧)

问题 位置 说明
消息队列 send+event 回滚误取 self_ptl.cpp:317/iec.cpp:336/com_scan.cpp:38 send 成功但 event_send 失败时,try_recv 从队首取可能误删旧消息。这是调用方逻辑问题,非 libtask 缺陷,需调用方自行处理。
task_msg_queue_send_timeout 未被使用 API 已提供但无调用者,三个 send 调用点可考虑切换为 timeout 版本避免队列满丢数据。