fix(lsof): start ringbuf consumer before iterator scan - #125
yuKing123-king wants to merge 1 commit into
Conversation
PR Reviewer Guide 🔍(Review updated until commit 3a41602)Here are some key observations to aid the review process:
|
ba47f8c to
0c8163f
Compare
|
/review 检视一下当前提交的PR,代码有无安全风险,和其他错误的地方 |
|
Preparing review... |
|
你好,这是对 libdkapture#125 fix(lsof): start ringbuf consumer before iterator scan 的评审。 本轮为 DKapture 两仓(libdkapture / dkapture-bpf)全部以 fix 开头 open PR 的批量评审,共 17 个;汇总表如下,本 PR 加粗。逐项详评见分隔线下方。
本 PR 评审详情作者: yuKing123-king | 规模: +17/-3 | 文件: 1 总体结论: 将 ringbuf 消费线程提前到 iterator 扫描之前启动,并用独立原子标志 scan_done 替代旧的 iter_fd==-1 判断扫描结束,方向正确,能消除原 TODO 注明的"扫描期间 ringbuf 无人消费导致丢事件"竞态。但新增的 stop_worker 清理标签没有任何 goto 跳转(死代码),而 pthread_create 之后两处 iterator 创建失败路径仍直接 goto err_out,构成 UAF + 线程泄漏。 主要问题:
次要建议:
亮点:
commit message: 标题符合 fix(lsof): 规范,但无正文;仓库近期 fix 提交(如 fix(switch_count)、fix(net-filter) 系列)均附根因说明正文,建议补充。 已有讨论: PR 下有 3 条 issue 评论:PR-Agent bot 评审(针对旧版本,指出两次 pthread_create 覆盖 t1 导致线程泄漏、第二个 worker 启动时 scan_done 已为 true 会过早退出)+ 作者发起 /review 的请求 + bot 的 Preparing review 占位。当前单 commit head 已消除 bot 指出的"第二次 pthread_create"问题;但 bot 指出的线程泄漏本质(错误路径不回收线程)在 head 上以新形式仍然存在,为本评审增量意见的核心。 |
Signed-off-by: Wang Yu <wangyu6@uniontech.com>
0c8163f to
3a41602
Compare
|
Persistent review updated to latest commit 3a41602 |
复审结论:可合并上轮问题的核实
本轮新发现(均为次要/风格,不阻塞)
commit message单 commit(amend),标题符合 fix(lsof) 规范;正文仍缺根因说明(上轮已提,可选)。 |
本次修改主要是修复了ringbuffer消耗不及时这个问题
由于起tail和vma占用文件只能最多起大概3000左右个进程,但是在bpf程序中,logs map的最大条目数却是256 * 1024 远远大于进程数,所以体现不出来ringbuffer消耗不及时这个问题。我将logs map的最大条目数从256 * 1024改成2 * 1024后,当启动1500个占用文件的进程后,lsof这个工具就会出现丢统计的情况。如下所示:
一、现象
3.原lsof只统计到了0个vma进程占用文件,修复后的lsof统计到了1500个vma进程

二、作出的修改
出现统计不及时的原因是先
bpf_iter_create(bpf_link__fd(obj->links.vma_iterator))和bpf_iter_create(bpf_link__fd(obj->links.file_iterator)),后pthread_create(&t1, NULL, ringbuf_worker, NULL),这就导致了先进行统计生产后,再统一进行消费,如果同时有很多进程占用文件,超过logs map的最大条目数就会出现统计错误和报错。将
pthread_create(&t1, NULL, ringbuf_worker, NULL)放在bpf_iter_create(bpf_link__fd(obj->links.vma_iterator))和bpf_iter_create(bpf_link__fd(obj->links.file_iterator))之前启动这个线程,就可以边生产边消费。同时我将void *ringbuf_worker(void *)这个的退出条件,从if (err == 0 && iter_fd == -1)换成使用scan_done这个更明确的状态变更。