These crashes are failure to reserve and/or commit memory in the child process from `sandbox::InterceptionManager::PatchNtdll`. Most of the crashes show a memory exhaustion condition on the system, with only few megabytes left of page file and/or physical memory. ```c++ // Reserve a full 64k memory range in the child process. HANDLE child = child_->Process(); BYTE* thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( child, nullptr, kAllocGranularity, MEM_RESERVE, PAGE_NOACCESS)); // Find an aligned, random location within the reserved range. size_t thunk_bytes = interceptions_.size() * sizeof(ThunkData) + sizeof(DllInterceptionData); size_t thunk_offset = internal::GetGranularAlignedRandomOffset(thunk_bytes); // Split the base and offset along page boundaries. thunk_base += thunk_offset & ~(kPageSize - 1); thunk_offset &= kPageSize - 1; // Make an aligned, padded allocation, and move the pointer to our chunk. size_t thunk_bytes_padded = (thunk_bytes + kPageSize - 1) & ~(kPageSize - 1); thunk_base = reinterpret_cast<BYTE*>( ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_EXECUTE_READWRITE)); CHECK(thunk_base); // If this fails we'd crash anyway on an invalid access. ``` We could potentially recycle [the weird trick](https://hacks.mozilla.org/2022/11/improving-firefox-stability-with-this-one-weird-trick/) here and sleep and retry (bug 1716727) to try to save the main process.
Bug 1737467 Comment 5 Edit History
Note: The actual edited comment in the bug view page will always show the original commenter’s name and original timestamp.
These crashes are failure to reserve and/or commit memory in the child process from code running in the main process in `sandbox::InterceptionManager::PatchNtdll`. Most of the crashes show a memory exhaustion condition on the system, with only few megabytes left of page file and/or physical memory. ```c++ // Reserve a full 64k memory range in the child process. HANDLE child = child_->Process(); BYTE* thunk_base = reinterpret_cast<BYTE*>(::VirtualAllocEx( child, nullptr, kAllocGranularity, MEM_RESERVE, PAGE_NOACCESS)); // Find an aligned, random location within the reserved range. size_t thunk_bytes = interceptions_.size() * sizeof(ThunkData) + sizeof(DllInterceptionData); size_t thunk_offset = internal::GetGranularAlignedRandomOffset(thunk_bytes); // Split the base and offset along page boundaries. thunk_base += thunk_offset & ~(kPageSize - 1); thunk_offset &= kPageSize - 1; // Make an aligned, padded allocation, and move the pointer to our chunk. size_t thunk_bytes_padded = (thunk_bytes + kPageSize - 1) & ~(kPageSize - 1); thunk_base = reinterpret_cast<BYTE*>( ::VirtualAllocEx(child, thunk_base, thunk_bytes_padded, MEM_COMMIT, PAGE_EXECUTE_READWRITE)); CHECK(thunk_base); // If this fails we'd crash anyway on an invalid access. ``` We could potentially recycle [the weird trick](https://hacks.mozilla.org/2022/11/improving-firefox-stability-with-this-one-weird-trick/) here and sleep and retry (bug 1716727) to try to save the main process.