Descubren y arreglan bug de 33 años de edad en Yacc.

Una vez más, el proyecto OpenBSD soluciona uno de los bugs más viejos. Otto Moerbeek, desarrollador del proyecto OpenBSD, ha estado trabajando en una nueva implementación de malloc() con algunas características extra que ayudan a prevenir el desbordamiento de pila. La implementación de malloc() de Otto había estado probándose hasta que Nikolay Sturm reporto que había problemas con SPARC64 cuando se compilaban programas grandes escritos en C++. Por lo general, dichos programas fallaban no por sintaxis sino por un error interno del compilador (ICE, Internal Compliler Error).

La nueva implementación de malloc() de Otto tiene algunas características que no se encuentran en ninguna otra implementación: mueve asignaciones de memoria pequeñas que una pagina pero más grandes que la mitad de una pagina al final de la pagina, y así tener mayor chance de atrapar buffer overflows.

El bug lo encontró apagando su implementación de malloc() e investigando en SPARC64 hasta que usando una versión con símbolos de depuración del compilador pudo interpretar un backtrace con gdb en donde el compilador moría en yyparse(), una función generada por el generador yacc.

El bug solo se dispara en SPARC64, ya que esta arquitectura usa paginas de 8k. El tamaño del stack de yacc por omisión para C++ es de 24 * 200 = 4800 bytes.

Más información en BSD Journal.

Subir