Linux corrige un fallo que podía borrar datos silenciosamente y llevaba oculto desde 2023

Linux corrige un fallo que podía borrar datos silenciosamente y llevaba oculto desde 2023

Linux acaba de corregir uno de esos errores que cualquier desarrollador teme especialmente: los datos podían desaparecer sin que el sistema se colgara ni mostrara necesariamente un error claro. El fallo estaba activo desde julio de 2023, ya que llegó a las versiones públicas a partir de Linux 6.6. Se sabe que había provocado pérdidas de datos reales entre usuarios de Polars, una conocida biblioteca de análisis de datos. Lo que más sorprende de todo esto, como leemos en Phoronix, es el contraste entre la gravedad del asunto y la solución.

Tras permanecer unos tres años en el código del kernel, la solución fue modificar una sola línea para evitar que Linux pierda una marca interna que indica que determinados datos en memoria han sido modificados. No era un fallo teórico: usuarios de Polars ya habían perdido datos El propio parche incorpora una descripción que deja poco lugar a dudas. Sus desarrolladores explican que usuarios de Polars, una biblioteca empleada para análisis y procesamiento de datos, habían encontrado el problema en entornos de producción. De hecho, un desarrollador confirmó más tarde que también había sufrido este problema en otro kernel derivado y que la corrección solucionó el problema.

Este fallo se describe como “corrupción silenciosa de memoria”, una situación especialmente incómoda porque la aplicación puede continuar ejecutándose sin que el usuario detecte inmediatamente que los datos han dejado de ser los esperados”. El problema estaba en cómo Linux recordaba que una página había cambiado. Este sistema operativo mantiene información sobre las páginas de memoria, entre ella un indicador que señala si el contenido ha sido modificado. Ese estado es vital para saber que los datos actuales no deben descartarse como si siguieran siendo prescindibles.

El bug estaba en pmd_modify(), dentro del código de gestión de memoria para x86. En algunos casos, esta función eliminaba silenciosamente el bit PAGE_DIRTY, que precisamente indica que la memoria ha cambiado. Tras eso, Linux encontraba una página que parecía no haber sido modificada y podía liberarla bajo presión de memoria. Todo se arregla eliminando una pequeña parte de una línea El cambio aplicado resulta casi ridículo comparado con las consecuencias.

Antes, pmd_modify() preservaba determinados indicadores, pero eliminaba expresamente PAGE_DIRTY. El parche modifica esa máscara para conservar también el estado dirty, igualando su comportamiento con otras rutas similares de gestión de páginas. Básicamente, ocupa dos líneas porque una desaparece y otra la sustituye. Estamos ante “una corrección de una sola línea”.

Es uno de esos errores que demuestran que hasta una simple línea de código puede causar estragos y permanecer años sin detectarse. La solución llega con Linux 7.3 RC2. En resumen, aunque es un fallo que no es tan sencillo de replicar en un ordenador doméstico, sí que es de bastante gravedad. Que Linux pueda olvidar que unos datos acababan de modificarse y terminar descartándolos silenciosamente bajo presión de memoria no es una cuestión menor.

Por suerte, ya está resuelto, aunque simplemente se haya cambiado una línea de código.