CVE-2026-99000 in Linux
Sumário
de VulDB • 23/10/2026
No kernel do Linux, a seguinte vulnerabilidade foi resolvida:
drm/xe: Corrige subtração dupla na contabilidade do shrinker em pins externos aninhados
As funções xe_bo_pin_external() e xe_bo_unpin_external() suportam pins aninhados, já que o ttm_bo_pin()/ttm_bo_unpin() subjacente mantém uma refcount pin_count (contagem de pins) em vez de um booleano. No entanto, as chamadas de contabilidade do shrinker, xe_ttm_tt_account_subtract() e xe_ttm_tt_account_add(), são invocadas incondicionalmente a cada chamada para pin_external()/unpin_external(), ao invés de serem executadas apenas nas transições para o estado pinned (fixado) e fora dele.
Um BO externo (dma-buf) pode ser fixado mais de uma vez enquanto já estiver fixo, por exemplo, quando possui múltiplos anexos/importadores, cada um chamando independentemente a xe_bo_pin_external(). Cada pin aninhado subtrai novamente as páginas do BO da contabilidade do shrinker, mesmo que as páginas do BO já tenham sido removidas da consideração pelo primeiro pin. Simetricamente, cada unpin (desfixamento) aninhado adiciona essas páginas de volta antes que o BO seja realmente desfixado. Isso dessincroniza a contagem de páginas e objetos do shrinker em relação à realidade real; como elas são declaradas como signed long (inteiro com sinal longo), mas interpretadas como unsigned long (inteiro sem sinal longo) na xe_shrinker_count(), um underflow pode se transformar em uma contagem enorme de pages shrinkable/purgeable, fazendo com que o shrinker seja invocado excessivamente sob pressão de memória.
Proteja as chamadas de contabilidade com os mesmos checks de transição pin-count já usados para proteger a manutenção da lista pinned_link, garantindo que a contabilidade seja atualizada apenas no pin mais externo e no unpin final.
Ao centralizar essa lógica em xe_bo_account_pin()/xe_bo_account_unpin(), também feche uma segunda lacuna de contabilidade relacionada que afeta dma-bufs importados. Para o ttm_tt de um bo importado, a hook do TTM xe_ttm_tt_populate() retorna antecipadamente sem chamar xe_ttm_tt_account_add(), pois TTM_TT_FLAG_EXTERNAL está definido sem TTM_TT_FLAG_EXTERNAL_MAPPABLE. No entanto, o wrapper ttm_tt_populate() do core marca incondicionalmente o tt como populated (populado) no sucesso da hook do driver, então ttm_tt_is_populated() ainda retorna true para ele. xe_bo_account_pin()/xe_bo_account_unpin() confiava em ttm_tt_is_populated() como um proxy para "essas páginas estão contabilizadas pelo shrinker", e subtrairia/adicionaria páginas para tal tt que nunca foram adicionadas inicialmente, causando novamente underflow nas contagens do shrinker. Isso é alcançável hoje via xe_bo_pin_external(), e se tornaria acessível no caminho fb-pin assim que este patch rotear __xe_pin_fb_vma() através de xe_bo_pin_account() abaixo; portanto, corrija-o aqui em vez de em um patch posterior para evitar um commit nesta série que introduza a regressão antes de corrigi-la. Ignore a contabilidade para bos importados, usando o mesmo teste EXTERNAL && !EXTERNAL_MAPPABLE usado por xe_ttm_tt_populate()/xe_ttm_tt_unpopulate() para decidir se deve agir, através de uma nova helper xe_ttm_bo_is_imported() (elevada do seu único local de uso anterior).
v2: - Corrija o problema crítico detectado pela revisão da Sashiko AI: o check de transição pin-count introduzido aqui ainda era contornado pelo caminho fb-pin (__xe_pin_fb_vma()/__xe_unpin_fb_vma()), o que poderia deixar uma entrada pinned_link obsoleta e um vazamento permanente na contabilidade do shrinker quando o unpin do fb realizasse o último unpin verdadeiro. Resolvido em um patch de acompanhamento separado nesta série, ao invés de ser incorporado aqui, pois é um bug distinto com sua própria tag Fixes:. - Remova a variável local "last_unpin" desnecessária em xe_bo_unpin_external(), restaurando o check inline original bo->ttm.pin_count == 1; era uma renomeação sem efeito (no-op) não utilizada por nenhuma das novas helpers de contabilidade, e seria excluída novamente pelo patch de acompanhamento.
v3: - Exclua dma-bufs importados da contabilidade do shrinker pin/unpin, corrigindo outro underflow detectado pela revisão da Sashiko AI. - Adicione um comentário curto no local de pin do backup-object observando que ele já está populated/contabilizado no momento do pin, abordando (como uma clarificação de falso positivo, sem necessidade de correção de código) uma preocupação separada de vazamento de contabilidade de severidade média também detectada pela Sashiko AI.
---truncado---
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.