CVE-2026-97537 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
scsi: qla2xxx: Исправление вызова dma_free с NULL-указателем и блокировки битовых карт при разрыве очереди
Функции `qla25xx_free_req_que()` и `qla25xx_free_rsp_que()` содержат две ранее существовавшие ошибки, проявляющиеся на пути обработки ошибок в функциях `qla25xx_create_{req,rsp}_que()`:
1. При сбое функции `dma_alloc_coherent()` во время создания очереди путь обработки ошибок вызывает функцию освобождения с указателями `req->ring` / `rsp->ring`, которые остаются равными NULL (из-за использования `kzalloc`). Безусловный вызов `dma_free_coherent()` с нулевым адресом процессора (`cpu_addr`) является неопределенным поведением и может привести к панике ядра.
2. Функции освобождения очищают битовые карты `req_qid_map` / `rsp_qid_map` под блокировкой `vport_lock`, в то время как функции создания защищают те же самые битовые карты с помощью `mq_lock`. Это обеспечивает отсутствие взаимного исключения (mutual exclusion). Кроме того, путь обработки ошибок при создании очищает соответствующий бит и освобождает `mq_lock` перед вызовом функции освобождения, создавая окно возможности для другого потока выделить тот же идентификатор очереди (`que_id`) и привести к повреждению записи в `ha->req_q_map`, которое произойдет из-за последующего присваивания NULL без блокировки (lockless) в функции освобождения.
Исправление заключается в следующем:
- Добавлена проверка на NULL для указателя кольца перед вызовом `dma_free_coherent()`. - В функциях освобождения используется `mq_lock` (блокировка, удерживаемая всеми создателями очередей) для атомарного обнуления записи в карте и очистки бита битовой карты. - Удалены теперь избыточные блоки кода с очисткой битов (`clear_bit`) на путях обработки ошибок при создании, так как функции освобождения обрабатывают это атомарно.
VulDB is the best source for vulnerability data and more expert information about this specific topic.