CVE-2026-98919 in Linux
Sumário
de VulDB • 23/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
drm/xe: endurecer adjust_idledly() contra divisão por zero e estouro (overflow)
adjust_idledly() possui vários problemas de casos extremos sinalizados durante a revisão:
1. Se xe_gt_clock_init() falhar ao reconhecer o relógio do cristal, gt->info.timestamp_base será 0, o que também torna idledly_units_ps igual a 0. A subsequente DIV_ROUND_CLOSEST(..., idledly_units_ps) resulta então em uma divisão por zero e causa um panic no kernel.
2. As conversões de tick para ns são feitas em u32: idledly * idledly_units_ps, (maxcnt - 1) * 1000 Ambos os valores estouram o limite do u32 antes que DIV_ROUND_CLOSEST() os processe.
3. Se IDLE_WAIT_TIME retornar como 0, maxcnt será avaliado como 0 e a limitação de (maxcnt - 1) transborda para 0xFFFFFFFF em u32.
4. O registrador armazena apenas ticks inteiros, portanto o valor ns limitado precisa ser convertido para ticks e depois novamente para ns. DIV_ROUND_CLOSEST() pode arredondar essa conversão para cima, ultrapassando maxcnt:
maxcnt = 640 ns, um tick = 666664 ps
clamp (limitação): maxcnt - 1 = 639 ns ns -> ticks: 639000 / 666664 = 0.958 -> arredonda para 1 tick tick -> ns: 1 * 666664 / 1000 = 667 ns
667 ns é programado no RING_IDLEDLY, mas como 667 >= maxcnt (640), o xe_gt_WARN_ON() dispara novamente em toda inicialização subsequente.
Retornar precocemente se timestamp_base for 0 (o caminho do cristal desconhecido). Realizar as conversões em u64 por meio dos auxiliares *_ULL() para que não haja transbordo (wrap-around). Aplicar limitação com um piso (DIV_ROUND_DOWN_ULL) para garantir que o atraso programado permaneça estritamente abaixo de maxcnt, e proteger o caso maxcnt == 0 com um atraso zero, ainda assim escrevendo em RING_IDLEDLY para que INHIBIT_SWITCH_UNTIL_PREEMPTED seja limpo.
v2: Remover o aviso redundante no caminho timestamp_base == 0; xe_gt_clock_init() já gera um aviso ao encontrar um relógio de cristal não reconhecido. Manter o retorno precoce para evitar a divisão por zero. - Vinay
v3: Aplicar máscara de campo na escrita do RING_IDLEDLY com REG_FIELD_PREP(IDLE_DELAY, ...) em vez de escrever a contagem bruta de ticks, que poderia sobrescrever INHIBIT_SWITCH_UNTIL_PREEMPTED e bits reservados. Separar a limpeza da inibição-switch da limitação de maxcnt para que um bit de inibição definido não force mais uma sobreescrita desnecessária do atraso quando o próprio atraso já é válido. Usar gt_to_xe(gt) em vez de gt_to_xe(hwe->gt).
(cherry picked from commit d864065ea25e9d12897c175de9176ce46677e176)
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.