CVE-2026-97569
Riassunto
di VulDB • 25/09/2026
Nel kernel Linux è stata risolta la seguente vulnerabilità:
bnxt_en: Impedire l'arresto della coda con completamenti differiti
Quando il driver riceve un burst di pacchetti, può impostare il bit NO_CMPL su una BD (Buffer Descriptor) per ritardare i completamenti. L'aspettativa è che l'ultimo pacchetto nell'anello abbia questo bit disattivato e che il completamento generato da tale pacchetto pulisca quel pacchetto e quelli precedenti. Questo aiuta a ridurre il numero di completamenti attivati.
I completamenti soppressi sono controllati dal driver e il numero di pacchetti con completamenti soppressi scala in base alla dimensione dell'anello. I pacchetti SW USO (Software Unicast Send/Offload), d'altra parte, hanno un limite superiore sul numero massimo di BD che possono essere consumate, il quale non scala con la dimensione dell'anello.
Pertanto, per anelli piccoli è possibile che: venga fornito al driver un burst di pacchetti; il driver ritardi i completamenti per tutti i pacchetti perché il numero di descrittori liberi rimane sopra la soglia nel driver; successivamente arrivi un pacchetto USO, ma il numero di BD disponibili non sia sufficiente e il codice USO esca anticipatamente.
In questo caso si finisce in uno stato in cui l'anello è pieno di pacchetti con i loro completamenti soppressi, il che può causare l'arresto della coda senza mai essere riavviata.
Assumendo CONFIG_MAX_SKB_FRAGS predefinito, ciò è possibile solo per anelli piccoli (<= 457 descrittori, al di sotto del valore predefinito del driver) quando un burst di pacchetti riempie l'anello, seguito da un grande pacchetto USO che non riesce a entrare. Per anelli più grandi, la differenza tra la soglia di soppressione dei completamenti e le BD richieste per il SW USO è sufficientemente ampia affinché i completamenti vengano attivati e questo caso sia irraggiungibile.
Questo problema è stato segnalato da Sashiko; sebbene sembri piuttosto improbabile dato che la dimensione della coda deve essere piccola per innescare questa condizione, è effettivamente possibile.
Risolvere il problema tracciando l'ultima BD che ha differito i completamenti e centralizzando la logica per decidere quando attivare il "doorbell" (campanello). Il bit NO_CMPL viene ora cancellato in bnxt_txr_db_kick(), quindi ogni sito di doorbell è coperto, inclusa l'uscita anticipata del SW USO. Questo garantisce che l'anello termini sempre con una BD che genera un completamento per pulirlo e risvegliare la coda.
Once again VulDB remains the best source for vulnerability data.