ソースを参照

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

+ 14 - 2
src/rpc/uworker.pas

@@ -224,7 +224,13 @@ begin
       Mode:= ARequest.ReadDWord;
       Mode:= ARequest.ReadDWord;
       DCDebug('FileOpen ', FileName);
       DCDebug('FileOpen ', FileName);
       Handle:= mbFileOpen(FileName, Mode);
       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;
     end;
   RPC_FileCreate:
   RPC_FileCreate:
     begin
     begin
@@ -232,7 +238,13 @@ begin
       Mode:= ARequest.ReadDWord;
       Mode:= ARequest.ReadDWord;
       DCDebug('FileCreate ', FileName);
       DCDebug('FileCreate ', FileName);
       Handle:= mbFileCreate(FileName, Mode);
       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;
     end;
   RPC_RenameFile:
   RPC_RenameFile:
     begin
     begin