소스 검색

FIX: Hangs when cannot open/create file with elevation (issue #1379)

Alexander Koblov 1 년 전
부모
커밋
a0c19151b5
2개의 변경된 파일21개의 추가작업 그리고 3개의 파일을 삭제
  1. 7 1
      src/rpc/uelevation.pas
  2. 14 2
      src/rpc/uworker.pas

+ 7 - 1
src/rpc/uelevation.pas

@@ -296,6 +296,7 @@ end;
 function TWorkerProxy.ProcessObject(ACommand: UInt32; const ObjectName: String;
   Mode: Integer): THandle;
 var
+  LastError: Integer;
   Stream: TMemoryStream;
 begin
   Result:= feInvalidHandle;
@@ -314,7 +315,12 @@ begin
       // Send command
       FClient.WriteBuffer(Stream.Memory^, Stream.Size);
       // Receive command result
-      FClient.ReadHandle(Result);
+      FClient.ReadBuffer(LastError, SizeOf(LastError));
+      if (LastError = 0) then
+        FClient.ReadHandle(Result)
+      else begin
+        SetLastOSError(LastError);
+      end;
     finally
       Stream.Free;
     end;

+ 14 - 2
src/rpc/uworker.pas

@@ -224,7 +224,13 @@ begin
       Mode:= ARequest.ReadDWord;
       DCDebug('FileOpen ', FileName);
       Handle:= mbFileOpen(FileName, Mode);
-      ATransport.WriteHandle(Handle);
+      if (Handle <> feInvalidHandle) then
+        LastError:= 0
+      else begin
+        LastError:= GetLastOSError;
+      end;
+      ATransport.WriteBuffer(LastError, SizeOf(LastError));
+      if (LastError = 0) then ATransport.WriteHandle(Handle);
     end;
   RPC_FileCreate:
     begin
@@ -232,7 +238,13 @@ begin
       Mode:= ARequest.ReadDWord;
       DCDebug('FileCreate ', FileName);
       Handle:= mbFileCreate(FileName, Mode);
-      ATransport.WriteHandle(Handle);
+      if (Handle <> feInvalidHandle) then
+        LastError:= 0
+      else begin
+        LastError:= GetLastOSError;
+      end;
+      ATransport.WriteBuffer(LastError, SizeOf(LastError));
+      if (LastError = 0) then ATransport.WriteHandle(Handle);
     end;
   RPC_RenameFile:
     begin