A vulnerabilidade é causada por um estouro da variável `sglist` e pela verificação incorreta de `sg dma len(sglist)` antes de `nents`. Normalmente, isso não causa uma falha, mas, neste caso, `sglist` ultrapassou um limite de página. O bug ocorre no seguinte código: `while (sg dma len(sglist) && nents--)`. A correção consiste simplesmente em testar `nents` primeiro e mover a decrementação de `nents` para dentro do loop.