Fixes: 5ba15d4 riscv: lib: add strnlen() implementation
故障现象
dm设备名出现了截断,只能显示8个字符
sh-5.2# dmsetup create testname9 --table "0 8 zero"
sh-5.2# cat /sys/block/dm-*/dm/name
testname
故障原因
故障触发是通过sys接口查看设备名称,内核调用dm_attr_name_show->strcat->strlcat->strnlen,而count为SIZE_MAX,由于strnlen代码出现了溢出导致了截断或panic
代码修改
功能正确性:原先的 ZBB 优化路径在 SIZE_MAX 或地址溢出情况下可能出现错误行为,需要强制回退到安全的通用实现。
边界安全:通过调整对齐边界和增加溢出检查,避免在极端输入下访问越界内存。
测试覆盖率:KUnit 增加了 SIZE_MAX 的测试,确保补丁中的回退逻辑在单元测试中得到验证,避免未来回归。
整体来说,这次修改既修复了 strnlen 在极值输入下的潜在 bug,又通过 KUnit 测试增强了验证覆盖率,保证实现和测试两方面都能覆盖边界情况。
Fixes: 5ba15d4 riscv: lib: add strnlen() implementation
故障现象
dm设备名出现了截断,只能显示8个字符
sh-5.2# dmsetup create testname9 --table "0 8 zero"
sh-5.2# cat /sys/block/dm-*/dm/name
testname
故障原因
故障触发是通过sys接口查看设备名称,内核调用dm_attr_name_show->strcat->strlcat->strnlen,而count为SIZE_MAX,由于strnlen代码出现了溢出导致了截断或panic
代码修改
功能正确性:原先的 ZBB 优化路径在 SIZE_MAX 或地址溢出情况下可能出现错误行为,需要强制回退到安全的通用实现。
边界安全:通过调整对齐边界和增加溢出检查,避免在极端输入下访问越界内存。
测试覆盖率:KUnit 增加了 SIZE_MAX 的测试,确保补丁中的回退逻辑在单元测试中得到验证,避免未来回归。
整体来说,这次修改既修复了 strnlen 在极值输入下的潜在 bug,又通过 KUnit 测试增强了验证覆盖率,保证实现和测试两方面都能覆盖边界情况。