2
0
Эх сурвалжийг харах

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

Alexander Koblov 1 жил өмнө
parent
commit
a0c19151b5

+ 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