<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=iso-8859-1" http-equiv=Content-Type>
<META content="MSHTML 5.00.2014.210" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2><BR>Problemes et corrections apportees sur le 
gestionnaire FAT.<BR>Toutes les corrections decrites impliquent le fichier 
drivers/fs_fat.c et seulement celui ci:</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>1. Syndrome de la traversee de cluster:<BR>&nbsp; 
Au cours de l'exploration d'un repertoire, il est incorrectement fait 
l'hypothese que la prochaine<BR>&nbsp;entree possible de repertoire est toujours 
situee apres l'entree courante. Cette hypothese est fausse<BR>&nbsp;si l'entree 
courante est la derniere du cluster.<BR>&nbsp;Fonctions 
impliquees:<BR>&nbsp;&nbsp; - fat_unlink<BR>&nbsp;&nbsp; - 
fat_dir_lookup<BR>&nbsp;&nbsp; - fat_readdir<BR>&nbsp;&nbsp; - 
fetch_node_from_disk<BR>&nbsp;&nbsp; - fat_mount</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;La correction a consiste a introduire une 
fonction sos_fat_helper_get_following_directory_entry qui<BR>&nbsp;verifie la 
condition et qui provoque une commutation vers le cluster suivant, quand il 
existe. Cette<BR>&nbsp;fonction doit etre appelee en preliminaire a chaque 
utilisation de sos_fat_helper_get_next_directory_entry.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>2. fonction&nbsp; 
sos_fat_helper_get_next_directory_entry <BR>&nbsp;&nbsp; probleme constate : 
bouclage de la fonction lors d'un franchissement de cluster.<BR>&nbsp;&nbsp; Le 
groupe de variables locales (sector_nr, sector_limit) n'est pas recalcule apres 
une <BR>&nbsp; commutation de cluster. Ceci provoque un cycle 
infini.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>3. fonction 
sos_fat_helper_find_free_directory_entry<BR>&nbsp; 3.1: probleme de meme nature 
que celui decrit en (2)<BR>&nbsp; 3.2: En cas d'epuisement du stock d'entree 
(dans le dernier cluster) aucune extension n'est 
tentee<BR>&nbsp;&nbsp;&nbsp;&nbsp; sous forme de generation d'un nouveau 
cluster.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>4. determination de la variable 
FirstRootDirSecNum:<BR>&nbsp;&nbsp; Il s'agit du premier secteur du repertoire 
racine.&nbsp; Elle est exprimee en unite de secteurs.<BR>&nbsp; Au moment du 
montage -fonction fat_mount- et dans le cas d'un systeme FAT 32, cette variable 
est<BR>&nbsp;exprimee en unite de cluster (au lieu d'unite de 
secteur).<BR>&nbsp;<BR>5. Fonction fat_mount<BR>&nbsp; Recensement du repertoire 
racine: <BR>&nbsp; D'une part cette fonction est atteinte par le syndrome de la 
traversee de cluster, mais,<BR>&nbsp; d'autre part, l'operation de recensement 
des fichiers du repertoire racine est incorrectement <BR>&nbsp; initialisee: 
l'exploration du repertoire racine est lancee a partir d'une adresse incorrecte 
<BR>&nbsp; fixee a 32 octets AVANT le debut reel du repertoire (donc pointant 
sur la queue de la derniere FAT)</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>6. fonction fat_write<BR>&nbsp;&nbsp; Calage 
incorrect du buffer d'ecriture dans l'utilisatiuon de la fonction 
sos_blockdev_kernel_write.<BR>&nbsp;&nbsp; L'offset specifiant ce calage est 
improprement multiplie par 4.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>7. Fonction sos_fat_helper_read<BR>&nbsp;&nbsp; 
Estimation incorrecte du nombre de clusters impliques dans l'operation de 
lecture.<BR>&nbsp;&nbsp; Dans le cas ou le debut de la lecture ne coincide pas 
avec une frontiere de cluster,<BR>&nbsp;&nbsp; la lecture est tronquee du 
contenu du dernier cluster.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>8. Fonction sos_fat_helper_read<BR>&nbsp;&nbsp; 
Determination du volume de donnees dans la lecture du premier 
cluster.<BR>&nbsp;&nbsp; Dans le cas ou les notions de cluster et de secteurs ne 
sont pas geometriquement equivallentes,<BR>&nbsp; le volume de donnee de la 
premiere lecture, impliquant le premier cluster est incorrectement<BR>&nbsp; 
estime.<BR>&nbsp;&nbsp; Le determination du volume de donnee initiale doit etre 
calcule comme suit:<BR>&nbsp;&nbsp;&nbsp;&nbsp; len : cluster_size - 
(storage_location - first_data_sector_location) % 
cluster_size<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avec: 
first_data_sector_location: origine (adresse octet) du premier secteur de 
donnnees <BR>&nbsp;&nbsp;&nbsp; au lieu de:<BR>&nbsp;&nbsp;&nbsp;&nbsp; len : 
cluster_size - storage_location % cluster_size<BR>&nbsp;&nbsp; Ces deux formules 
divergent des que la taille d'un cluster est differente de celle d'un 
secteur.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>9. Fonction 
sos_fat_helper_get_next_directory_entry<BR>&nbsp;&nbsp; Certaines entrees ne 
sont pas vues dans les conditions suivantes:<BR>&nbsp;&nbsp; - la taille du 
cluster est strictement superieure a 1 (c'est&nbsp; a dire qu'un cluster 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; comprend au moins deux secteurs)<BR>&nbsp;&nbsp; - 
la recherche dans le repertoire commence a partir du debut du 
repertoire<BR>&nbsp;&nbsp; - l'entree du fichier cherche ne se situe pas dans le 
premier secteur du repertoire<BR>&nbsp; Le probleme vient de la variable 
"sector_rem" specifiant la premiere entree de repertoire a 
explorer:</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp; Elle est en fait relative a un 
secteur.<BR>&nbsp; Elle doit etre remise a zero des que l'exploration du premier 
secteur est terminee, sinon, <BR>&nbsp; les "sector_rem" entrees du secteur 
suivant sont occultees. </FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>10. Fonction 
sos_fat_helper_find_free_directory_entry:<BR>&nbsp; Meme nature de probleme que 
celui evoque en (9)<BR>&nbsp; Ici, il ne s'agit pas a proprement parler d'un 
probleme, puisque les conditions necessaires <BR>&nbsp; a son apparition ne sont 
jamais remplies dans la realisation actuelle.</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp; Une correction a neanmoins ete 
apporte&nbsp;avec le patch joint.<BR>&nbsp;&nbsp;<BR>&nbsp;11. Fonction 
sos_fat_helper_remove_all_cluster:<BR>&nbsp;&nbsp;&nbsp; Une operation 
excedentaire de mise a jour de FAT est declenchee.<BR>&nbsp;&nbsp;&nbsp; Le 
cluster implique, s'il etait licite, serait celui correpondant au code de fin de 
<BR>&nbsp;&nbsp; cluster (cluster numero 0xFFF8, dans le cas de FAT 
16)<BR>&nbsp;&nbsp;&nbsp;&nbsp; Generalement cette operation provoque une 
alteration de la seconde FAT, ou des donnnes utiles 
...<BR>&nbsp;<BR></FONT><FONT face=Arial size=2></FONT></DIV>
<DIV><FONT face=Arial size=2>Christian Guerineau</FONT></DIV>
<DIV><FONT face=Arial size=2>Ci joint: patch corrigeant les problemes ci dessus 
evoques.</FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;</DIV></FONT></BODY></HTML>