Rapport de bug
Stéphane Rivière via Ada-france <[email protected]> Thu, 14 Oct 2021 10:37:23 +0200
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Organization | La Maison |
| Message-ID | <[email protected]> |
Bonjour à tous, J'aurais du poser la question avant de leur envoyer, mais est-ce ainsi qu'il faut procéder ? As-t'on une chance de voir le bug corrigé sans proposer un patch ? Stéphane ------------------------------------------------------------ envoyé à [email protected] Bonjour, J'espère que c'est le bon email... Ada.Directories.Del_Tree semble avoir un problème sous Linux (pas testé d'autres OS). Voir le détail ci-dessous. En espérant avoir été utile, et en vous remerciant pour la maintenance CE/FSF. Cordialement, Stéphane Rivière ========================== • Exception with Delete_Tree dealing with broken symbolic links In french only: Ada.Directories.Del_Tree déclenche une exception en présence d'un lien symbolique cassé dans un répertoire de l'arborescence à effacer: raised ADA.IO_EXCEPTIONS.USE_ERROR: directory tree rooted at "/home/sr/opt/gnat-2019/lib/xmlada/xmlada_input.relocatable" could not be deleted. • Demo L'empilement général est : Ada.Directories.Delete_Tree > Is_Valid_Path_Name > Is_Directory Ada > is_Directory C > adaint.c > __gnat_is_directory > __gnat_reset_attributes > __gnat_is_directory_attr > *__gnat_stat_to_attr* > __gnat_stat > GNAT_STAT Du coté de More_Entries > Fetch_Next_Entry > readdir_gnat > Match On arrive à un lien symbolique cassé libxmlada_input_sources.so qui est déclaré ne pas exister par File_Exists_Attr (C_Full_Name'Address, Attr'Access); en 776 qui est en fait __gnat_file_exists_attr en 1668 de adaint.c qui fait référence à une structure dans adaint.h: ----------------------------- struct file_attributes { int error; /* Errno value returned by stat()/fstat(). If non-zero, other fields should be considered as invalid. */ unsigned char exists; unsigned char writable; unsigned char readable; unsigned char executable; unsigned char symbolic_link; unsigned char regular; unsigned char directory; ----------------------------- Qui appelle *__gnat_stat_to_attr* Qui teste un file descripteur à -1, lien symbolique cassé je suppose... Puis __gnat_stat qui renvoie 2 à __gnat_stat_to_att Avec le test suivant en 1124 de adaint.c if (error == 0 || error == ENOENT) attr->error = 0; Et dans s-oscons.ads ENOENT: constant := 2; -- File not found ! La suite devient alors compréhensible. Le lien symbolique cassé libxmlada_input_sources.so est déclaré ne pas exister, la routine sort du répertoire courant (qu'elle croit donc vidé) pour l'effacer et explose alors quand elle tente d'effacer ce répertoire vide mais qui ne l'est pas, une exception est déclenchée… • Solving On pourrait re-coder cette fonction récursive plus simplement. Cru voir en traçant que la fonction C d'effacement récursif existe déjà… Toutefois, le mieux serait de corriger l’anomalie qui est probablement dans _gnat_stat, afin que cette fonction retourne la bonne valeur et ne confonde pas 'n'existe pas' (le fichier sur lequel pointe le lien symbolique) avec 'n'existe pas' (le fichier symbolique). ========================== -- Stéphane Rivière Ile d'Oléron - France _______________________________________________ Ada-france mailing list [email protected] https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france