[HUST CSE][finsh] validate backtrace thread address#11343
[HUST CSE][finsh] validate backtrace thread address#11343Telecaster2147 wants to merge 1 commit intoRT-Thread:masterfrom
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: kernelReviewers: @GorrayLi @ReviewSun @hamburger-os @lianux-mm @wdfk-prog @xu18838022837 Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-04-22 15:55 CST)
📝 Review Instructions
|
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
当前 finsh 的
backtrace [thread_address]命令直接把用户输入解析成地址后,再用该地址调用rt_object_get_type()判断对象类型。这个实现默认调用方传入的是一个真实有效的线程对象地址;一旦用户传入任意无效地址、悬空地址或者并非 RT-Thread 对象的地址,命令路径就可能在对象类型判断前后访问非法内存,导致异常行为甚至崩溃。这个问题出现在 shell 命令入口,属于运行时输入校验不足,不适合继续依赖“用户总是输入合法线程地址”来规避。更安全的做法是把用户输入当作不可信数据处理,只在当前线程对象表中确认该地址确实对应一个真实线程对象后,才继续执行 backtrace。
你的解决方案是什么 (what is your solution)
本 PR 在
src/kservice.c中对cmd_backtrace()做了针对性的输入校验和线程查找重构:新增
cmd_backtrace_parse_pid():argv[1]的地址解析;0值做显式拒绝;end_ptr == argv[1]带来的宽松解析。新增
cmd_backtrace_find_thread()和cmd_backtrace_match_thread():RT_Object_Class_Thread对象列表,只在输入地址与当前系统里真实存在的线程对象地址完全匹配时,才返回目标线程。调整
cmd_backtrace()主流程:Invalid input;Invalid pid;rt_backtrace_thread(target)。请提供验证的bsp和config (provide the config and bsp)
BSP:
bsp/qemu-vexpress-a9.config:
qemu-vexpress-a9当前主线配置作为验证基线;RT_USING_CONSOLE、RT_USING_FINSH和 backtrace 相关选项,可覆盖本次修复的命令路径;action: 暂无
补充说明:
bsp/qemu-vexpress-a9可成功生成rtthread.elf和rtthread.bin;msh />;backtrace 0x1时,修复后命令能够稳定返回Invalid pid: 1,未出现非法地址访问导致的异常;backtrace <有效线程地址>时,命令能够进入正常的线程 backtrace 路径。]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up