Skip to content

Commit a9d1e72

Browse files
committed
[MERGE #5214 @MikeHolman] remove unnecessary validation when connecting to JIT process
Merge pull request #5214 from MikeHolman:partialcopy We connect to JIT process before script runs, so we don't need to validate that the modules passed are valid (and this validation code was insufficient anyway). This fixes issue where on rare occasion ReadProcessMemory was returning STATUS_PARTIAL_COPY and causing validation to fail. Apparently ReadProcessMemory hitting a page fault can cause this, which seems like the most probable cause. OS: 11823544
2 parents bbe5cc3 + 2f33a57 commit a9d1e72

File tree

1 file changed

+0
-89
lines changed

1 file changed

+0
-89
lines changed

lib/JITServer/JITServer.cpp

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -119,85 +119,6 @@ __RPC_USER PSCRIPTCONTEXT_HANDLE_rundown(__RPC__in PSCRIPTCONTEXT_HANDLE phConte
119119
ServerCleanupScriptContext(nullptr, &phContext);
120120
}
121121

122-
HRESULT CheckModuleAddress(HANDLE process, LPCVOID remoteImageBase, LPCVOID localImageBase)
123-
{
124-
byte remoteImageHeader[0x1000];
125-
MEMORY_BASIC_INFORMATION remoteImageInfo;
126-
SIZE_T resultBytes = VirtualQueryEx(process, (LPCVOID)remoteImageBase, &remoteImageInfo, sizeof(remoteImageInfo));
127-
if (resultBytes != sizeof(remoteImageInfo))
128-
{
129-
Assert(UNREACHED);
130-
return E_ACCESSDENIED;
131-
}
132-
if (remoteImageInfo.BaseAddress != (PVOID)remoteImageBase)
133-
{
134-
Assert(UNREACHED);
135-
return E_ACCESSDENIED;
136-
}
137-
if (remoteImageInfo.Type != MEM_IMAGE)
138-
{
139-
Assert(UNREACHED);
140-
return E_ACCESSDENIED;
141-
}
142-
if (remoteImageInfo.State != MEM_COMMIT)
143-
{
144-
Assert(UNREACHED);
145-
return E_ACCESSDENIED;
146-
}
147-
148-
if (remoteImageInfo.RegionSize < sizeof(remoteImageHeader))
149-
{
150-
Assert(UNREACHED);
151-
return E_ACCESSDENIED;
152-
}
153-
154-
if (!ReadProcessMemory(process, remoteImageBase, remoteImageHeader, sizeof(remoteImageHeader), &resultBytes))
155-
{
156-
return HRESULT_FROM_WIN32(GetLastError());
157-
}
158-
if (resultBytes < sizeof(remoteImageHeader))
159-
{
160-
Assert(UNREACHED);
161-
return E_ACCESSDENIED;
162-
}
163-
PIMAGE_DOS_HEADER localDosHeader = (PIMAGE_DOS_HEADER)localImageBase;
164-
PIMAGE_NT_HEADERS localNtHeader = (PIMAGE_NT_HEADERS)((BYTE*)localDosHeader + localDosHeader->e_lfanew);
165-
166-
PIMAGE_DOS_HEADER remoteDosHeader = (PIMAGE_DOS_HEADER)remoteImageHeader;
167-
PIMAGE_NT_HEADERS remoteNtHeader = (PIMAGE_NT_HEADERS)((BYTE*)remoteDosHeader + remoteDosHeader->e_lfanew);
168-
169-
uintptr_t remoteHeaderMax = (uintptr_t)remoteImageHeader + sizeof(remoteImageHeader);
170-
uintptr_t remoteMaxRead = (uintptr_t)remoteNtHeader + sizeof(IMAGE_NT_HEADERS);
171-
if (remoteMaxRead >= remoteHeaderMax || remoteMaxRead < (uintptr_t)remoteImageHeader)
172-
{
173-
Assert(UNREACHED);
174-
return E_ACCESSDENIED;
175-
}
176-
177-
if (localNtHeader->FileHeader.NumberOfSections != remoteNtHeader->FileHeader.NumberOfSections)
178-
{
179-
Assert(UNREACHED);
180-
return E_ACCESSDENIED;
181-
}
182-
if (localNtHeader->FileHeader.NumberOfSymbols != remoteNtHeader->FileHeader.NumberOfSymbols)
183-
{
184-
Assert(UNREACHED);
185-
return E_ACCESSDENIED;
186-
}
187-
if (localNtHeader->OptionalHeader.CheckSum != remoteNtHeader->OptionalHeader.CheckSum)
188-
{
189-
Assert(UNREACHED);
190-
return E_ACCESSDENIED;
191-
}
192-
if (localNtHeader->OptionalHeader.SizeOfImage != remoteNtHeader->OptionalHeader.SizeOfImage)
193-
{
194-
Assert(UNREACHED);
195-
return E_ACCESSDENIED;
196-
}
197-
198-
return S_OK;
199-
}
200-
201122
HRESULT
202123
ServerConnectProcess(
203124
handle_t binding,
@@ -229,16 +150,6 @@ ServerConnectProcess(
229150
return E_ACCESSDENIED;
230151
}
231152
#endif
232-
hr = CheckModuleAddress(targetHandle, (LPCVOID)chakraBaseAddress, (LPCVOID)AutoSystemInfo::Data.dllLoadAddress);
233-
if (FAILED(hr))
234-
{
235-
return hr;
236-
}
237-
hr = CheckModuleAddress(targetHandle, (LPCVOID)crtBaseAddress, (LPCVOID)AutoSystemInfo::Data.GetCRTHandle());
238-
if (FAILED(hr))
239-
{
240-
return hr;
241-
}
242153
return ProcessContextManager::RegisterNewProcess(clientPid, targetHandle, chakraBaseAddress, crtBaseAddress);
243154
}
244155

0 commit comments

Comments
 (0)