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