从这个网页截图中,我们可以获取到以下关于漏洞的关键信息: 1. 漏洞描述: - NVMe (Non-Volatile Memory Express) 协议的 keep-alive 操作可能会在关闭控制器时触发一个潜在的竞态条件。 - 这个竞态条件可能导致控制器管理队列(invoked while shutting down controller)和 hw/hctx 队列调度器(called from the nvme keep-alive async request queuing operation)之间的竞争。 - 这种竞争可能导致内核崩溃。 2. 问题原因: - 在关闭控制器时,如果 keep-alive 请求提前触发,可能会导致控制器管理队列被意外删除。 - 这种情况下,控制器关闭代码路径(invoked while shutting down controller)可能会在另一个 CPU 上同时运行,导致控制器管理队列被删除。 - 由于 keep-alive 线程尚未完成其工作,可能会尝试访问已经被删除的控制器管理队列资源,从而导致内核崩溃。 3. 修复方法: - 通过将 keep-alive 操作改为同步操作,确保在 keep-alive 操作完成后再执行控制器关闭代码路径。 - 在 keep-alive 操作完成后,确保控制器管理队列资源仍然存在,然后再执行控制器关闭代码路径。 4. 代码变更: - 代码中添加了同步操作,确保在执行控制器关闭代码路径之前,keep-alive 操作已经完成。 - 修改了 nvme_queue_keep_alive_end_io 函数,确保在执行控制器关闭代码路径之前,保持控制器管理队列资源。 通过这些信息,我们可以理解这个漏洞是如何发生的,以及修复方法是如何解决这个问题的。