CVE-2024-37353 in Linux
Сводка
по VulDB • 22.05.2026
Вот исправленный код для функции `vp_find_vqs_msix` в драйвере `virtio_net` (или более общем `virtio_pci_modern`/`vp_modern`), который удаляет уже созданные виртуальные очереди (VQ), если `request_irq()` для одной из них завершается ошибкой.
Проблема заключается в том, что при неудачном запросе прерывания для текущей очереди необходимо откатить изменения для всех уже успешно созданных предыдущих очередей, чтобы избежать утечки ресурсов и несогласованного состояния.
### Исправление
В функции `vp_find_vqs_msix` (обычно находится в `drivers/virtio/virtio_pci_modern.c` или аналогичном файле для modern virtio-pci) нужно добавить очистку уже созданных VQ перед возвратом ошибки.
```c static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned int nvqs, struct virtqueue *vqs[],
const char * const names[],
const vq_callback_t *callbacks[],
const char * const names[],
struct irq_affinity *desc) {
struct vp_device *vp_dev = to_vp_device(vdev); int err, i; int *vecs = NULL;
/* ... существующий код инициализации ... */
for (i = 0; i < nvqs; i++) {
/* ... создание VQ ... */ /* Запрос прерывания */ err = request_irq(vp_dev->msix_entries[i].vector,
vp_virtqueue_isr, 0, vqs[i]->name, vqs[i]);
if (err) {
/* ИСПРАВЛЕНИЕ: Удаляем уже созданные VQ */ int j; for (j = 0; j < i; j++) {
/* Отключаем прерывание, если оно было успешно запрошено ранее */ free_irq(vp_dev->msix_entries[j].vector, vqs[j]);
/* Удаляем VQ из virtio_core */ vdev->config->del_vq(vqs[j]);
} return err; } }
/* ... остальной код ... */ return 0; } ```
### Пояснение
1. **Цикл очистки**: Если `request_irq()` для очереди `i` терпит неудачу, мы проходим по всем предыдущим очередям от `0` до `i-1`. 2. **`free_irq()`**: Для каждой предыдущей очереди вызываем `free_irq()`, чтобы освободить обработчик прерывания. 3. **`del_vq()`**: Вызываем `vdev->config->del_vq(vqs[j])`, чтобы удалить виртуальную очередь из подсистемы virtio, так как она была успешно создана на предыдущих шагах.
4. **Возврат ошибки**: После очистки возвращаем код ошибки, чтобы инициализация драйвера завершилась неудачно, но без утечки ресурсов.
Это гарантирует, что при ошибке на любом этапе создания очереди все ранее созданные ресурсы будут корректно освобождены.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.