miércoles, mayo 14, 2008

Un bug de 25 años en los BSD: seekdir()

(vía reddit.programming) Ayer leyendo los correos de la lista de Samba vi una incidencia cuando se utilizaba en cualquier sistema con código derivado de *BSD (FreeBsd, NetBSD, OpenBSD o MacOS X), existía un problema cuando los ficheros se servían desde un sistema distinto a UFS. Esta mañana encontraba When seekdir() Won't Seek to the Right Position", la explicación de porqué Samba no funcionaba correctamente en estos sistemas con esta configuración (si se instala directamente desde las fuentes, Samba moría con una llamada a abort(), en los ports elimaban el check, pero tampoco funcionaba de manera correcta).
La gente de Samba documentaba el tema de la siguiente manera:
This is needed because the existing directory handling in FreeBSD and OpenBSD (and possibly NetBSD) doesn't correctly handle unlink() on files in a directory where telldir() has been used. On a block boundary it will occasionally miss a file when seekdir() is used to return to a position previously recorded with telldir().
Aproximandamente, la explicación de lo que sucede es la siguiente:si usamos un código para recorrer directorios,usamos telldir() para guardar la posición actual, y posteriormente volvemos a ella con seekdir(), si ha ocurrido un borrado (unlink()) de alguno de los elemenos, no vuelve a la posición correcta.
Esta historia lleva a unas pocos reflexiones interesantes.
  • No por tener las fuentes los fallos aparecen y se corrigen antes. Hay que saber explicar y proporcionar los test que llevan a la reproducción de los fallos para corregirse y sobre todo, hay que saber cómo y donde buscar.
  • A veces, la gente se preocupa de programar con Linux como objetivo, siempre cuesta un poco de tunning por mucho configure y portable que sea el código que funcione en otros Unix (con o sin fuentes) algunos programas.
  • Se tiende a establecer workarounds para fallos de los sistemas, cosa que luego los enquista y hacen que para que funcione tal o cual programa se tenga que mantener un código de compatibilidad que acaba por frenar la evolución. Windows es la prueba de ello.
  • A veces la comunicación entre diferentes proyectos de fuentes abiertas es complicada, en especial cuando hay que demostrar de quien es la culpa

No hay comentarios: