[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