[SOS] Sur l'utilisation du systeme de fichier FAT
guerineau
chris.guer at wanadoo.fr
Sam 8 Mar 18:04:41 CET 2008
Problemes et corrections apportees sur le gestionnaire FAT.
Toutes les corrections decrites impliquent le fichier drivers/fs_fat.c et seulement celui ci:
1. Syndrome de la traversee de cluster:
Au cours de l'exploration d'un repertoire, il est incorrectement fait l'hypothese que la prochaine
entree possible de repertoire est toujours situee apres l'entree courante. Cette hypothese est fausse
si l'entree courante est la derniere du cluster.
Fonctions impliquees:
- fat_unlink
- fat_dir_lookup
- fat_readdir
- fetch_node_from_disk
- fat_mount
La correction a consiste a introduire une fonction sos_fat_helper_get_following_directory_entry qui
verifie la condition et qui provoque une commutation vers le cluster suivant, quand il existe. Cette
fonction doit etre appelee en preliminaire a chaque utilisation de sos_fat_helper_get_next_directory_entry.
2. fonction sos_fat_helper_get_next_directory_entry
probleme constate : bouclage de la fonction lors d'un franchissement de cluster.
Le groupe de variables locales (sector_nr, sector_limit) n'est pas recalcule apres une
commutation de cluster. Ceci provoque un cycle infini.
3. fonction sos_fat_helper_find_free_directory_entry
3.1: probleme de meme nature que celui decrit en (2)
3.2: En cas d'epuisement du stock d'entree (dans le dernier cluster) aucune extension n'est tentee
sous forme de generation d'un nouveau cluster.
4. determination de la variable FirstRootDirSecNum:
Il s'agit du premier secteur du repertoire racine. Elle est exprimee en unite de secteurs.
Au moment du montage -fonction fat_mount- et dans le cas d'un systeme FAT 32, cette variable est
exprimee en unite de cluster (au lieu d'unite de secteur).
5. Fonction fat_mount
Recensement du repertoire racine:
D'une part cette fonction est atteinte par le syndrome de la traversee de cluster, mais,
d'autre part, l'operation de recensement des fichiers du repertoire racine est incorrectement
initialisee: l'exploration du repertoire racine est lancee a partir d'une adresse incorrecte
fixee a 32 octets AVANT le debut reel du repertoire (donc pointant sur la queue de la derniere FAT)
6. fonction fat_write
Calage incorrect du buffer d'ecriture dans l'utilisatiuon de la fonction sos_blockdev_kernel_write.
L'offset specifiant ce calage est improprement multiplie par 4.
7. Fonction sos_fat_helper_read
Estimation incorrecte du nombre de clusters impliques dans l'operation de lecture.
Dans le cas ou le debut de la lecture ne coincide pas avec une frontiere de cluster,
la lecture est tronquee du contenu du dernier cluster.
8. Fonction sos_fat_helper_read
Determination du volume de donnees dans la lecture du premier cluster.
Dans le cas ou les notions de cluster et de secteurs ne sont pas geometriquement equivallentes,
le volume de donnee de la premiere lecture, impliquant le premier cluster est incorrectement
estime.
Le determination du volume de donnee initiale doit etre calcule comme suit:
len : cluster_size - (storage_location - first_data_sector_location) % cluster_size
avec: first_data_sector_location: origine (adresse octet) du premier secteur de donnnees
au lieu de:
len : cluster_size - storage_location % cluster_size
Ces deux formules divergent des que la taille d'un cluster est differente de celle d'un secteur.
9. Fonction sos_fat_helper_get_next_directory_entry
Certaines entrees ne sont pas vues dans les conditions suivantes:
- la taille du cluster est strictement superieure a 1 (c'est a dire qu'un cluster
comprend au moins deux secteurs)
- la recherche dans le repertoire commence a partir du debut du repertoire
- l'entree du fichier cherche ne se situe pas dans le premier secteur du repertoire
Le probleme vient de la variable "sector_rem" specifiant la premiere entree de repertoire a explorer:
Elle est en fait relative a un secteur.
Elle doit etre remise a zero des que l'exploration du premier secteur est terminee, sinon,
les "sector_rem" entrees du secteur suivant sont occultees.
10. Fonction sos_fat_helper_find_free_directory_entry:
Meme nature de probleme que celui evoque en (9)
Ici, il ne s'agit pas a proprement parler d'un probleme, puisque les conditions necessaires
a son apparition ne sont jamais remplies dans la realisation actuelle.
Une correction a neanmoins ete apporte avec le patch joint.
11. Fonction sos_fat_helper_remove_all_cluster:
Une operation excedentaire de mise a jour de FAT est declenchee.
Le cluster implique, s'il etait licite, serait celui correpondant au code de fin de
cluster (cluster numero 0xFFF8, dans le cas de FAT 16)
Generalement cette operation provoque une alteration de la seconde FAT, ou des donnnes utiles ...
Christian Guerineau
Ci joint: patch corrigeant les problemes ci dessus evoques.
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: http://the-doors.enix.org/pipermail/sos/attachments/20080308/c3886597/attachment-0001.htm
-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: sos_10_fat.pat
Type: application/octet-stream
Taille: 21032 octets
Desc: non disponible
Url: http://the-doors.enix.org/pipermail/sos/attachments/20080308/c3886597/attachment-0001.obj
Plus d'informations sur la liste de diffusion Sos