![]()
没有人能说服软件开发者卡米拉·舍夫奇克"新的就是更好的"——她刚刚修复了Enlightenment E16(一款老牌Linux窗口管理器)中一个存在了20年的缺陷。她告诉我们,她之所以偏爱E16,部分原因正是这款软件已经是一个真正意义上"完成"的产品。
对于不熟悉E16的读者来说,它是Enlightenment的长期维护分支DR16,这款Linux窗口管理器于1997年首次进入开源软件社区,E16版本则于1999年推出,至今仍由舍夫奇克等一批忠实开发者持续维护。她在自己撰写的缺陷分析文章中提到,自己是少数仍在使用和维护这款老旧窗口管理器的"铁杆爱好者"之一。
今年21岁的舍夫奇克在她的博客中解释说,这个缺陷是她在德国萨尔大学担任研究生助教期间,赶制课程幻灯片时偶然发现的。
"我有几份用LaTeX排版的PDF讲义和练习题。有一次我在Atril中打开其中一份,整个桌面直接卡死了。"她写道。这种情况反复出现,直到她找到了根本原因:每当E16尝试截断她正在处理的文件那个过长的名称时,系统就会挂起。
经过深入排查,舍夫奇克发现E16在实现窗口标题截断算法时,没有设置迭代次数上限。缺少这个上限,居中省略号的搜索过程就可能在截断点之间无限循环,导致桌面在寻找合适标题的过程中彻底冻结。
"任何WM_NAME足够长、导致居中省略号搜索进入过冲状态的窗口都会触发这个问题。"舍夫奇克解释说。
她针对2024年8月发布的E16 1.0.30版本提交了修复补丁,做出了三项改动以防止问题再次发生:将迭代次数上限设为32次、防止负值修正产生退化重叠,以及防范除以零的错误。
如果20年前的代码中存在这类缺陷,那现代代码里又潜藏着什么
如果这个缺陷出现在现代窗口管理器或桌面环境中,可能会成为一种拒绝服务攻击途径。虽然它不会破坏数据或锁定服务器,但仍然会造成极大的不便。
"毫无疑问,类似的缺陷正潜伏在驱动现代桌面环境和窗口管理器的数百万行代码之中。"舍夫奇克在接受采访时表示。
不过,她对那些现代桌面环境和窗口管理器本就存有几分偏见。她认为,这些产品所遵循的现代软件开发理念,从根本上是适得其反的,对用户而言也更不安全。
"我觉得我们有点偏离初衷了,"她说,"我们远远不够愿意承认:软件在某个时刻是可以达到完成状态的。"
E16就是个例子:在其数十年的生命周期里确实发布了新版本,但那些更新大多是缺陷修复和少量基础调整,而非堆砌一大堆不必要的新功能。
"我们一直在交付本不必要交付的不稳定性。"舍夫奇克直言不讳。她建议那些总想追最新版本的用户或管理员停下来,选择留在近期版本或长期支持版本上,尤其是对于那些历来缺陷较多的软件,比如网页浏览器。
"由能力出众的开发者维护的老旧软件,其私有代码库中的缺陷数量会单调递减。"舍夫奇克在博客中写道。
这一逻辑同样适用于拥有更大用户群体的大型项目的长期支持版本:安于现有功能、持续跟进安全补丁、关注缺陷数量(希望能)持续下降,这样的策略可能比升级到包含你不需要的新功能、同时引入一堆新缺陷的最新版本要安全得多。
Q&A
Q1:E16窗口管理器的桌面冻结缺陷是什么原因造成的?
A:E16在实现窗口标题截断算法时,没有设置迭代次数上限。当窗口名称过长时,居中省略号的搜索逻辑会在截断点之间无限循环,导致桌面完全卡死无法响应。这个缺陷存在了大约20年,直到开发者舍夫奇克在日常使用中偶然触发并追查到根本原因。
Q2:舍夫奇克是如何修复E16桌面冻结缺陷的?
A:她针对E16 1.0.30版本提交了一个补丁,主要做了三项修改:将迭代次数上限限制为32次,防止负值修正导致退化重叠,以及防范潜在的除以零错误。这三项改动共同堵住了导致无限循环的漏洞,从根本上解决了桌面冻结的问题。
Q3:舍夫奇克对现代软件开发方式有什么看法?
A:她认为现代软件开发过于追求不断堆叠新功能,反而忽视了稳定性。她建议用户留在近期版本或长期支持版本上,而不是一味追新,并指出由有能力的开发者长期维护的成熟软件,其缺陷数量会随时间持续减少,安全性反而更有保障。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.