El recolector de basura del subsistema AF_UNIX del kernel de Linux existe porque los descriptores de socket pueden enviarse entre procesos mediante SCM_RIGHTS y quedar inalcanzables desde el espacio de usuario, sin que se libere la memoria asociada. Este artículo técnico recorre, paso a paso, la reescritura completa del mecanismo —publicada en el kernel a partir de 2024— y analiza un fallo de uso después de liberación (use-after-free) detectado en él.
El nuevo diseño modela cada socket en vuelo como un vértice y cada descriptor transportado en un mensaje SCM_RIGHTS como una arista dirigida. A partir de esa representación en grafo, el algoritmo de Tarjan calcula las componentes fuertemente conexas (SCC) y solo marca como recolectables aquellas que forman ciclos y cuyos sockets cumplen la condición file_count == out_degree, es decir, que ninguna referencia desde el espacio de usuario puede alcanzarlos de nuevo. Los sockets que no pertenecen a ningún ciclo se omiten sin más.
La función __unix_gc() despacha entre una vía lenta, que reconstruye las SCC desde cero, y una vía rápida (unix_walk_scc_fast) que reutiliza el agrupamiento previo cuando no ha habido cambios estructurales. El disparo del recolector se produce cuando el contador global unix_tot_inflight supera las 16.000 entradas o cuando se cierra un socket con descriptores aún en vuelo. El texto incluye extractos de código reales del kernel, explica la estructura unix_sock, el campo inflight y la transición desde el antiguo algoritmo basado en recorrido con bloqueos por cola, y concluye con la descripción detallada del bug de use-after-free, cuyas implicaciones de estabilidad se discuten al final.
