E' stato scoperto in questo modo:
viene scritto un programma che crea una directory e la riempie con un certo numero di file, cancellandone alcuni e andando poi a vedere se seekdir() è in grado di riportare alla posizione di partenza.
Dagli esperimenti emerge un curioso comportamento: se in una directory si creano 28 file e si cancella il venticinquesimo, seekdir() non torna, se richiesto, sul ventiseiesimo, ma sul successivo: probabilmente la cosa ha a che fare con l'occupazione di più blocchi di memoria. Da qui l'indagine si sposta al codice kernel, che rimuove una directory e alla libreria che implementa seekdir() e dintorni.
Com'è ovvio aspettarsi, adesso che si conosce il finale, il problema si trova all'interno di seekdir(), laddove si salta il primo elemento di un blocco, che è stato cancellato nel frattempo, settandone l'inode a zero. Per risolvere il problema occorre che _readdir_unlocked() non salti le voci di directory con inode a zero, quando viene chiamata da seekdir()
Secondo gli esperti, questo baco era presente dalla prima versione implementata di sistemi BSD, ben 25 anni fa.
Per buona salute...


E meno male che sui sitemi operativi Open Source, prima o poi si trova sempre tutto, e alla fine lo si risolve, spiegando le modifiche da fare, e rilasciando patch pubbliche ufficiali accettate da tutti!


http://www.programmazione.it/index.php? ... Item=39322