关键信息 漏洞描述 问题描述: 在 (具体实现为 ) 中,堆排序在开始时捕获了原始数据指针(变量 ),并在元素访问时继续使用该指针,即使用户提供的比较器块(如 方法)会修改数组并导致底层存储收缩或重新分配。在这些情况下,未检测到分配修改,排序例程继续使用过时的指针引用无效 入口进入 ,然后调用 返回垃圾数据并崩溃。 触发条件 触发条件: 对形式大于 的数组进行排序时触发,并且在比较期间使用自定义块修改数组——具体来说,Ruby fuzzer 的输入样式如 导致 函数收缩或重新分配数组存储的同时,堆排序仍使用旧指针,导致释放后使用(use-after-free)崩溃。 有关修复的信息 修正输入: 崩溃输出: 包含关于未定义行为 automatically 和少量堆栈跟踪的调试器输出,指出 中的段错误。 修复提交: 修改了堆排序实现,在每次潜在的修改后刷新数组指针,并在排序过程中增加了对数组长度的检查,以检测和处理分配的修改。 讨论和验证 社区反馈: 提交者和项目维护者就根本原因和修复技巧进行了讨论,最终确认修复有效性,并提交了补丁。 状态: 最终问题被标记为关闭(Closed),修复已通过提交 eb39897 实施并合并。