O problema surge quando uma tarefa é removida da fila de agendamento e as entregas pendentes de sigtrap são adiadas para a tarefa de destino ao retomar o espaço do usuário por meio do task work. Falhas ao adicionar o callback de um evento ao mecanismo task work são ignoradas, levando a uma pequena janela em que sigtraps pendentes podem ser enfileirados e ignorados, causando um vazamento na adição da contagem de referências do evento. Isso ocorre no seguinte cenário: quando uma tarefa é encerrada, a última chamada para a saída de eventos ocorre após o encerramento do task work, resultando no evento nunca ser liberado.
Os detalhes técnicos sobre a exploração incluem:
- O tratamento de erros da função `task work add()` é inadequado, levando ao vazamento.
- A variável `event->pending sigtrap` é usada para rastrear entregas de sigtrap pendentes.
- A função `irq work queue()` é usada para enfileirar o IRQ pendente.
- A função `perf event overflow()` está envolvida no cenário em que o vazamento ocorre.
- A função `event sched out()` é chamada quando a tarefa é agendada para saída.
- A função `perf pending irq()` retorna antecipadamente quando `event->oncpu` é -1.