Browse Source

rtl/amiga: do not UnLock the initial lock returned by CurrentDir in legacy MatchFirst

Karoly Balogh 3 years ago
parent
commit
08f3a3c8ef
1 changed files with 10 additions and 2 deletions
  1. 10 2
      rtl/amiga/m68k/legacydos.inc

+ 10 - 2
rtl/amiga/m68k/legacydos.inc

@@ -238,6 +238,7 @@ var
   Path,FileN: AnsiString;
   Path,FileN: AnsiString;
   LastSeparatorPos: Integer;
   LastSeparatorPos: Integer;
   i: Integer;
   i: Integer;
+  newLock: boolean;
   DirLock: BPTR;
   DirLock: BPTR;
   ib: TFileInfoBlock;
   ib: TFileInfoBlock;
   Res: LongInt;
   Res: LongInt;
@@ -272,12 +273,16 @@ begin
   // if no path is given use the current working dir, or try to lock the dir
   // if no path is given use the current working dir, or try to lock the dir
   if Path = '' then
   if Path = '' then
   begin
   begin
+    newLock := False;
     DirLock := CurrentDir(0);
     DirLock := CurrentDir(0);
     if DirLock <> 0 then
     if DirLock <> 0 then
-      CurrentDir(DirLock);
+      UnLock(CurrentDir(DirLock));
   end
   end
   else
   else
+  begin
+    newLock := True;
     DirLock := Lock(PChar(Path), ACCESS_READ);
     DirLock := Lock(PChar(Path), ACCESS_READ);
+  end;
   //
   //
   // no dirlock found -> dir not found
   // no dirlock found -> dir not found
   if DirLock = 0 then
   if DirLock = 0 then
@@ -289,6 +294,8 @@ begin
   if Examine(DirLock, @ib) = 0 then
   if Examine(DirLock, @ib) = 0 then
   begin
   begin
     MatchFirst := -1;
     MatchFirst := -1;
+    if newLock then
+      UnLock(DirLock);
     Exit;
     Exit;
   end;
   end;
   // we search here directly what we need to find
   // we search here directly what we need to find
@@ -334,7 +341,8 @@ begin
     // most importantly set the return code
     // most importantly set the return code
     MatchFirst := 0;
     MatchFirst := 0;
   end;
   end;
-  Unlock(DirLock);
+  if newLock then
+    Unlock(DirLock);
 end;
 end;
 
 
 function MatchNext(anchor: PAnchorPath): LongInt; public name '_fpc_amiga_matchnext';
 function MatchNext(anchor: PAnchorPath): LongInt; public name '_fpc_amiga_matchnext';