From bf0028cac1d98be809cb698ceeceef72429969c2 Mon Sep 17 00:00:00 2001 From: martin Date: Tue, 20 Aug 2019 22:16:37 +0000 Subject: [PATCH] Try to minimize (NOT a fix) the risks of TProcessUtf8 crashes. Crash introduced in r50595 #d0dace2bf5 for issue #28991 / See also issue #035991 git-svn-id: trunk@61736 - --- components/lazutils/utf8process.pp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/components/lazutils/utf8process.pp b/components/lazutils/utf8process.pp index e95781ba6e..144e56bcda 100644 --- a/components/lazutils/utf8process.pp +++ b/components/lazutils/utf8process.pp @@ -76,6 +76,7 @@ type {$ENDIF} {$IFDEF UseTProcessW} +{$Optimization -ORDERFIELDS } const SNoCommandLine = 'Cannot execute empty command-line'; SErrCannotExecute = 'Failed to execute %s : %d'; @@ -565,7 +566,10 @@ var o: TProcessClassTemplate; begin o:=TProcessClassTemplate.Create(nil); - PHANDLE(Pointer(Self)+(@o.FProcessHandle-Pointer(o)))^:=aProcessHandle; + if (@o.FProcessHandle-Pointer(o) <= TProcessUTF8.InstanceSize - SizeOf(HANDLE)) and + (PHANDLE(Pointer(Self)+(@o.FProcessHandle-Pointer(o)))^ = ProcessHandle) + then + PHANDLE(Pointer(Self)+(@o.FProcessHandle-Pointer(o)))^:=aProcessHandle; if aProcessHandle<>ProcessHandle then raise Exception.Create('TProcessUTF8.SetProcessHandle failed'); o.Free; @@ -576,7 +580,10 @@ var o: TProcessClassTemplate; begin o:=TProcessClassTemplate.Create(nil); - PHANDLE(Pointer(Self)+(@o.FThreadHandle-Pointer(o)))^:=aThreadHandle; + if (@o.FThreadHandle-Pointer(o) <= TProcessUTF8.InstanceSize - SizeOf(HANDLE)) and + (PHANDLE(Pointer(Self)+(@o.FThreadHandle-Pointer(o)))^ = ThreadHandle) + then + PHANDLE(Pointer(Self)+(@o.FThreadHandle-Pointer(o)))^:=aThreadHandle; if aThreadHandle<>ThreadHandle then raise Exception.Create('TProcessUTF8.SetThreadHandle failed'); o.Free; @@ -587,7 +594,10 @@ var o: TProcessClassTemplate; begin o:=TProcessClassTemplate.Create(nil); - PHANDLE(Pointer(Self)+(@o.FProcessID-Pointer(o)))^:=aProcessID; + if (@o.FProcessID-Pointer(o) <= TProcessUTF8.InstanceSize - SizeOf(HANDLE)) and + (PHANDLE(Pointer(Self)+(@o.FProcessID-Pointer(o)))^ = ProcessID) + then + PHANDLE(Pointer(Self)+(@o.FProcessID-Pointer(o)))^:=aProcessID; if aProcessID<>ProcessID then raise Exception.Create('TProcessUTF8.SetProcessID failed'); o.Free;