Skip to content

fix(trace-signal): validate invalid command line arguments and add tr… - #117

Open
yuKing123-king wants to merge 1 commit into
DKapture:mainfrom
yuKing123-king:test/add-trace-signal-BUILTIN
Open

yuKing123-king wants to merge 1 commit into
DKapture:mainfrom
yuKing123-king:test/add-trace-signal-BUILTIN

Conversation

@yuKing123-king

@yuKing123-king yuKing123-king commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

对本次 trace-signal工具修改的内容

  1. 补齐 BUILTIN 测试入口

    • 改为通过返回值处理参数解析结果,增强健壮性。
  2. 修复了一个测试过程中发现的 Bug

    • Bug 1: 修复当用户在终端传入非法参数时,无任何拦截和报错提示
      • 修复:添加了对非法参数的条件检验,将非法的参数进行拦截。

…ace-signal tool support builtin testing

Signed-off-by: Wang Yu <wangyu6@uniontech.com>
@dkapture-ci-bot

Copy link
Copy Markdown
Contributor

你好,这是对 libdkapture#117 fix(trace-signal): validate invalid command line arguments a 的评审。

本轮为 DKapture 两仓(libdkapture / dkapture-bpf)全部以 fix 开头 open PR 的批量评审,共 17 个;汇总表如下,本 PR 加粗。逐项详评见分隔线下方。

PR 标题 作者 规模 结论 主要风险
#149 fix(net-traffic): initialize rules before loadin yuKing123-king +19/-9 可合并 规则安装顺序与其它工具约定不一致;本仓改动无正确性缺陷
#147 fix(net-filter): abort rule loading on invalid c yuKing123-king +9/-3 需修改 失败时 clear_rules() 波及 add_rule() 装入的规则;空白注释行导致整个加载失败
#141 fix(dkapture): honor parsed pid in read(vector<p JoeSergen +23/-2 需修改 unsafe_find 单记录语义使 /proc//fd 只回调一次;返回值语义漂移
#140 fix(dkapture): return bytes read, not remaining JoeSergen +10/-4 可合并 无阻塞风险;与文档契约对齐,仓内无调用方依赖旧语义
#114 fix: replace manual destructor calls in construc JoeSergen +28/-7 需修改 捆绑了与 open PR #112 逐字节相同的 fs_watch 修复,跨 PR 重复
#125 fix(lsof): start ringbuf consumer before iterato yuKing123-king +17/-3 需修改 线程启动后错误路径仍 goto err_out → 释放运行中 rb(UAF)+ 线程泄漏
#112 fix: fs_watch calls trace_file_init instead of m JoeSergen +1/-1 可合并 无;仅修一处复制粘贴错误
#103 fix: make power-snoop internal symbols static fo yuKing123-king +3/-2 可合并 改动无害;但 PR 描述的 multiple definition 在当前构建配置下无法复现
#119 fix(syscall-stat): stop skipping syscall key 0 d yuKing123-king +18/-6 可合并 循环终止四条路径已逐一核实;缩进与提交拆分小问题
#115 fix(syscall-stat): improve builtin flow yuKing123-king +204/-41 需修改 三处 bpf_get_map_fd 错误路径未设 ret,最终 return ret 误报成功
#117 fix(trace-signal): validate invalid command line yuKing123-king +190/-29 需修改 BUILTIN 测试入口未接入 test/Makefile,不可达;register_signal 残留
#102 fix(trace-exec): reject invalid command line arg yuKing123-king +135/-22 需修改 BUILTIN 入口同样未接入构建;-h 退出码 0→1 属未说明的行为变更
#97 fix(so): reuse pinned dkapture bpf objects corre yuKing123-king +1/-1 需修改 test mock 仍按 map- 前缀命名 pin,合并后 gtest FindMap 用例失败
#35 fix(pagefault): add max_entries and value_size f yuKing123-king +7/-3 可合并 修复真实,但已被 main 上等效修复 1e90486 取代,建议确认后关闭
#32 fix(peek-fd): correct args field name from mvlen yuKing123-king +1/-1 可合并 无功能风险;标题/描述与实际改动方向不符
#30 fix(trace-signal): avoid inflight event key coll yuKing123-king +36/-22 需修改 sys_exit_kill 的 !rule 早退路径仍泄漏 inflight 条目
#29 fix(syscall-stat): replace exec fexit with kprob yuKing123-king +93/-13 阻塞 exec 路径从 struct filename* 本身读字符串,-f 过滤将完全失效

本 PR 评审详情

作者: yuKing123-king | 规模: +190/-29 | 文件: 1
结论: 需修改
主要风险: 新增的 BUILTIN 测试入口在当前构建配置中不可达(test/Makefile 未接入 trace-signal.o、无任何测试消费方),且 register_signal 的返回值改造因残留 exit(EXIT_FAILURE) 而成为死代码。

总体结论: 两个方向都合理:参数校验用 strtol(end==optarg、尾随字符、errno==ERANGE、类型上限)替换 atoi,修复了溢出与 "123abc" 类输入;BUILTIN 模式整体复刻已合入的 policy/frtp.cpp 模式。但 (1) 全 PR 只改 observe/trace-signal.cpp 一个文件,未把 trace-signal.o 接入 test/Makefile(test/Makefile 的 TARGET 依赖列表不含它,so/Makefile 同样不含),test/ 下也没有 trace-signal-test.cpp,标题里的 "add builtin testing" 实际没有落地,无法编译验证;(2) register_signal 保留 exit(EXIT_FAILURE),其后的 return -1 永远不可达,与 frtp 的写法相悖;(3) local_map_info 里 logs 的大小照抄了 frtp 的 1MB,与真实 skeleton 的 256KB 不符。

主要问题:

  • (P1) observe/trace-signal.cpp:372-377 (新) — trace_signal_main/trace_signal_init/deinit 无任何调用方:test/Makefile 的 TARGET 依赖(trace-file.o/lsock.o/kmemleak.o/irqsnoop.o/mountsnoop.o/frtp.o/elfverify.o)与 so/Makefile 的库对象列表均不含 trace-signal.o,test/ 下无 trace-signal-test.cpp。BUILTIN 代码既不参与编译也不被测试,功能不可达、无法证明可编译可链接。
  • (P2) observe/trace-signal.cpp:329-331 (新) — register_signal 失败路径 perror 后仍 exit(EXIT_FAILURE);,紧随其后的 return -1; 不可达,本次"用返回值传错"的改造落空;且 main:397-402 的 if (ret < 0) return ret; 若可达会泄漏 main:381 分配的 buf。对照已合入 frtp.cpp:672-675(只有 perror + return -1)。应删除 exit。
  • (P2) observe/trace-signal.cpp:63-67 (新) — local_map_info 声明 logs 为 {0, 1, 10241024, BPF_MAP_TYPE_RINGBUF},而真实 skeleton repos/dkapture-bpf/observe/trace-signal.bpf.c:47 是 2561024。frtp 的 1MB 是对的(frtp.bpf.c:137 即 1MB),此处系照抄未核对,mock 元数据与生产行为分歧,基于 mock 的测试断言会建立错误前提。

次要建议:

  • observe/trace-signal.cpp:217-226 (新) — 'S' 只校验正整数与 int 上限,未限定有效信号范围(1..NSIG-1),--sig 999999 会被接受但永远匹配不到事件。
  • observe/trace-signal.cpp:236 (新) — 'R' 拒绝负值但提示 "must be an integer",与其余 "must be a positive/non-negative integer" 措辞不一致。
  • observe/trace-signal.cpp:158-163 (新) — optind/opterr 用 #ifdef 区分(非 BUILTIN 仅 optind=1、未关 opterr),而已合入 frtp.cpp:253-254 与本 PR 组的 fix(trace-exec): reject invalid command line arguments and add support builtin testing #102 均无条件 optind = 0; opterr = 0;,应统一。
  • observe/trace-signal.cpp:395 (新) — return ret > 0 ? 0 : ret; 使 -h 返回 0、错误返回 -1(255);frtp/fix(trace-exec): reject invalid command line arguments and add support builtin testing #102 约定 help 返回 1。语义上 0 更常规,但同一作者的两个同模式 PR 应统一。
  • observe/trace-signal.cpp:177 等 (新) — 参数错误信息用 printf 输出到 stdout,frtp 同类错误用 pr_error;且 BUILTIN 下 stdout 被重定向,错误信息与正常输出混在同一文件。
  • (风格) observe/trace-signal.cpp:482 (新) — + // Wait for the worker thread to finish 注释缩进错位、与 pthread_join 分行。

亮点:

  • atoi → strtol 全套校验(end==optarg、尾随字符、ERANGE、pid_t/int 上限),修复溢出与垃圾尾缀被静默接受的问题。
  • exit_flag 从 bool 改为 std::atomic,消除信号处理函数与 ringbuf_worker 间的数据竞争。
  • cleanup 统一 free(buf)、obj 判空后 detach/destroy,并补上 attach/map 更新/ring_buffer__new 失败路径的 ret=-1,修复原先对 NULL 对象 detach 的隐患。
  • Usage/long_opt2short_opt/parse_args/ringbuf_worker/register_signal 加 static,呼应 fix(trace-exec): reject invalid command line arguments and add support builtin testing #102 行级讨论确认的多工具 .o 链接符号冲突。

commit message: 格式符合 fix(scope) 且 subject 覆盖全部改动;但 "add trace-signal tool support builtin testing" 语序不通,建议 "add builtin test support for trace-signal";单 commit 混合参数校验与测试入口两职责,可接受但不理想。

已有讨论: 无(comments/review-comments 均为空)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants