Skip to content

修复 iperf-glibc 卡死:O_TRUNC POSIX 合规 + devfs st_rdev 设备号 + mount 递归文件系统

StellaOS requested to merge merge_6.17 into main

三个关联 bug:

  1. VFS O_TRUNC 对设备文件返回 EINVAL(POSIX 规定应静默忽略),导致 busybox sh 的 2>/dev/null 重定向失败,报 "can't create /dev/null: Invalid argument"。同时 O_CREAT 路径补上设备文件分支,使用 new_dev_with_flags 替代 new。

  2. NullNode/ZeroNode/UrandomNode 缺少 get_attr(),ConsoleNode/TtyNode 未设置 st_rdev。glibc daemon() 调用 fstat 校验 st_rdev==makedev(1,3), 发现 st_rdev=0 返回 ENODEV,报 "unable to become a daemon"。 musl daemon() 不做此校验故不受影响。

  3. prepare_glibc_runtime 中 mount /dev/vdb /lib 在默认配置(vdb=vda) 下产生递归文件系统,导致后续 exec glibc 二进制时动态链接器解析 /lib/ld-linux-... 掉入递归路径而 hang。此前被 bug 1 掩盖(重定向 失败使 shell 跳过 mount 命令)。改为挂载到 /tmp_mnt,复制 libgcc_s.so.1 后立即卸载。

Merge request reports