详细内容或原文请订阅后点击阅览
经过 6 年清理,Strncpy 终于从 Linux 7.2 内核中删除
90 年代处理记忆的方式被官方认为是危险的。
来源:安全实验室新闻频道90 年代处理记忆的方式被官方认为是危险的。
Linux 内核终于还清了拖了多年的旧债:strncpy API 从 7.2 分支中完全删除。几十年来,该函数看起来像是一种安全复制给定长度字符串的简单方法,但实际上它经常给开发人员带来错误、不必要的 CPU 工作以及字符串完成方面的令人不快的意外。
strncpy() 最多复制给定数量的字节,但其行为并不像字符串函数所期望的那样。主要问题是字符串末尾的空字符。在某些情况下,该函数不会添加最终的 NUL,而在其他情况下,它会用零完成缓冲区的其余部分。对于内核代码来说,这种行为被证明是一个太方便的陷阱:开发人员可以认为字符串已正确终止,但实际上接收到的字段没有最终的空字节。同时,内核浪费了不必要的时间填充内存,即使代码不需要这样的操作。
内核开发人员称 strncpy 为错误的持续来源。删除过程花费了大约六年的时间,并且需要大约 362 次提交。在此期间,维护人员逐渐清除了各个子系统中旧的 strncpy 调用,用更明确的选项替换了有争议的函数,并使代码达到了内核中没有旧接口的用户的状态。
最终补丁
周五核心。除了 API 本身之外,单个处理器架构的 strncpy 的最新实现也已从源代码树中删除。合并补丁后,Linux 7.2内核不再向开发者提供内部strncpy接口。
删除 strncpy 看起来并不是 Linux 7.2 中的一个大自定义功能,但它对于内核来说是重要的一步。开发人员从代码库中删除了行为不明确的旧 API,并将其替换为一组从名称上就可以明确用途的函数。结果,代码变得更容易检查,并且一整类带有截断行和不正确完成的错误正在逐渐从内核中消失。
