g-dirope.adb (Remove_Dir): In case we are removing directories recursively...
authorFlorian Villoing <villoing@adacore.com>
Wed, 26 Sep 2007 10:44:16 +0000 (12:44 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 26 Sep 2007 10:44:16 +0000 (12:44 +0200)
2007-09-26  Florian Villoing  <villoing@adacore.com>

* g-dirope.adb (Remove_Dir): In case we are removing directories
recursively, make sure that if an exception is raised during the
processing, the current working directory is reset to its initial
value before propagating the exception.

From-SVN: r128792

gcc/ada/g-dirope.adb

index bb8ff93fb2046307eb6034482e46ff4014bfbc21..fe9b5f17aa6c4aecd13532852181cac84f93d0a7 100644 (file)
@@ -743,32 +743,52 @@ package body GNAT.Directory_Operations is
       --  Remove directory and all files and directories that it may contain
 
       else
-         Change_Dir (Dir_Name);
-         Open (Working_Dir, ".");
+         --  Substantial comments needed. See RH for revision 1.50 ???
 
-         loop
-            Read (Working_Dir, Str, Last);
-            exit when Last = 0;
+         begin
+            Change_Dir (Dir_Name);
+            Open (Working_Dir, ".");
 
-            if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
-               if Str (1 .. Last) /= "." and then Str (1 .. Last) /= ".." then
-                  Remove_Dir (Str (1 .. Last), True);
-                  Remove_Dir (Str (1 .. Last));
-               end if;
+            loop
+               Read (Working_Dir, Str, Last);
+               exit when Last = 0;
 
-            else
-               GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
+               if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
+                  if Str (1 .. Last) /= "."
+                       and then
+                     Str (1 .. Last) /= ".."
+                  then
+                     Remove_Dir (Str (1 .. Last), True);
+                     Remove_Dir (Str (1 .. Last));
+                  end if;
+
+               else
+                  GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
 
-               if not Success then
-                  Change_Dir (Current_Dir);
-                  raise Directory_Error;
+                  if not Success then
+                     Change_Dir (Current_Dir);
+                     raise Directory_Error;
+                  end if;
                end if;
-            end if;
-         end loop;
+            end loop;
+
+            Change_Dir (Current_Dir);
+            Close (Working_Dir);
+            Remove_Dir (Dir_Name);
+
+         exception
+            when others =>
 
-         Change_Dir (Current_Dir);
-         Close (Working_Dir);
-         Remove_Dir (Dir_Name);
+               --  An exception occurred. We must make sure the current working
+               --  directory is unchanged.
+
+               Change_Dir (Current_Dir);
+
+               --  What if the Change_Dir raises an exception itself, shouldn't
+               --  that be protected? ???
+
+               raise;
+         end;
       end if;
    end Remove_Dir;