Repository navigation
[components][ofw]fix: add depth limit check for fdt_unflatten to prevent stack flow - #11901
liangzhan5 wants to merge 6 commits into
Conversation
…ent stack overflow
…ent stack overflow
…ent stack overflow
…ent stack overflow
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: componentsReviewers: @Maihuanyi Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-10-20 16:00 CST)
📝 Review Instructions
|
|
运行期检查行不行,发现超了直接退出释放内存,不然我觉得花点时间先去检查不太划算 |
谢谢review。 感觉对不完整的树释放内存要手动实现(沿着指针递归遍历),很复杂,它这个内存分配零零散散的,然后还在很多次循环里,怕漏了或者说double free。还有运行期检查后退出可能错误路径处理比较麻烦。 这个check函数没有涉及内存分配或解析属性什么的,只读,跟unflatten本身开销比很小了。 |
|
因为 OFW 其实设计支持是偏“信任”固件的,64 层其实已经远远超出了大部分 SoC 的设备树需求,是否可以在 DEBUG 模式才启用这块代码? |
agree我推进一下 |
rt-thread/bsp/qemu-virt64-aarch64 关闭RT_USING_DEBUG: exception info: please use: addr2line -e rtthread.elf -a -f |
|
可以了,不过 |
好的我再改改 |
改好了 |
拉取/合并请求描述:(PR description)
[
related #11879
RT-Thread 的components/drivers/ofw/fdt.c里的函数 fdt_unflatten_single() 使用固定大小栈 np_stack[OFW_NODE_MAX_DEPTH](默认 64 项)来暂存遍历路径。当外部传入的 DTB 文件节点嵌套深度超过 64 层时,压栈前没有深度检查,导致栈越界写入,引发启动阶段 Data Abort 或崩溃。
我在主线的qemu上复现了这个bug。
你的解决方案是什么 (what is your solution)
在 rt_fdt_unflatten() 真正解平铺之前,增加一个预检查函数 fdt_check_depth_limit(),使用手动栈遍历 DTB(也是为了避免残留树和二次断言的问题),计算最大节点深度。若深度超过安全上限(OFW_NODE_MAX_DEPTH - 1,即 63),则直接挂起并打印错误,不进行后续解平铺,。
请提供验证的bsp和config (provide the config and bsp)
rt-thread/bsp/qemu-virt64-aarch64
编译结果:
~/rt-thread/bsp/qemu-virt64-aarch64$ python3 qemu.py -dtb virt_depth_63.dtb
[I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0
[I/rtdm.ofw] Machine model: linux,dummy-virt
...
[I/rtdm.mnt] File system initialization done
hello rt-thread
lza@lza-virtual-machine:~/rt-thread/bsp/qemu-virt64-aarch64$ python3 qemu.py -dtb virt_depth_64.dtb
[I/rtdm.ofw] Booting RT-Thread on physical CPU 0x0
[I/rtdm.ofw] Machine model: linux,dummy-virt
...
[I/mm.memblock] 52 MB memory installed to system page
[E/rtdm.ofw] DTB node depth exceeds limit 63, refuse to unflatten
]
当前拉取/合并请求的状态 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