В ядре Linux устранена следующая уязвимость:
dma-fence: сделать dma_fence_dedup_array() устойчивым к вводу с нулевым значением.
dma_fence_dedup_array() возвращает 1 при вызове с num_fences == 0:
тело цикла for никогда не выполняется, j остается равным 0, а последний
`return ++j` возвращает 1. Это противоречит как документации ядра ("Return:
Количество уникальных заборов, оставшихся в массиве") и естественный
ожидание, что 0 входных данных дает 0 выходных данных. Вызывающий __dma_fence_unwrap_merge() завершает работу через
`if (count == 0 || count == 1)` быстрый путь и сохранение.
Но amdgpu_userq_wait_*() может достичь вызова дедупликации с нулевым локальным значением.
подсчитайте и разыменуйте неинициализированный слот ограждения в массиве. Сделайте так, чтобы контракт соответствовал документации, вернув 0 раньше. Это
также пропускает ненужный вызов sort() для пустого массива.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: dma-fence: Make dma_fence_dedup_array() robust against 0-count input dma_fence_dedup_array() returns 1 when called with num_fences == 0: the for-loop body never executes, j stays at 0, and the final `return ++j` yields 1. This contradicts both the kernel-doc ("Return: Number of unique fences remaining in the array") and the natural expectation that 0 input gives 0 output. The caller __dma_fence_unwrap_merge() bails out via the `if (count == 0 || count == 1)` fast path and so is save. But amdgpu_userq_wait_*() could reach the dedup call with a zero local count and dereference an uninitialized fence slot in the array. Make the contract match the documentation by returning 0 early. This also skips an unnecessary sort() call on an empty array.
Характеристики атаки
Последствия
Строка CVSS v3.1