Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1310)

Unified Diff: third_party/crashpad/crashpad/util/win/safe_terminate_process.asm

Issue 2833533003: Update Crashpad to f487da4ff2c47a129e2f8f3a7e0c769b54e4585f (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/crashpad/crashpad/util/win/safe_terminate_process.asm
diff --git a/third_party/crashpad/crashpad/util/win/safe_terminate_process.asm b/third_party/crashpad/crashpad/util/win/safe_terminate_process.asm
new file mode 100644
index 0000000000000000000000000000000000000000..b219a9e659051db05cc868cc040b19ecacb975ef
--- /dev/null
+++ b/third_party/crashpad/crashpad/util/win/safe_terminate_process.asm
@@ -0,0 +1,74 @@
+; Copyright 2017 The Crashpad Authors. All rights reserved.
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+
+; Detect ml64 assembling for x86_64 by checking for rax.
+ifdef rax
+_M_X64 equ 1
+else
+_M_IX86 equ 1
+endif
+
+ifdef _M_IX86
+.586
+.xmm
+.model flat
+
+includelib kernel32.lib
+
+extern __imp__TerminateProcess@8:proc
+
+; namespace crashpad {
+; bool SafeTerminateProcess(HANDLE process, UINT exit_code);
+; } // namespace crashpad
+SAFETERMINATEPROCESS_SYMBOL equ ?SafeTerminateProcess@crashpad@@YA_NPAXI@Z
+
+_TEXT segment
+public SAFETERMINATEPROCESS_SYMBOL
+
+SAFETERMINATEPROCESS_SYMBOL proc
+
+ ; This function is written in assembler source because it’s important for it
+ ; to not be inlined, for it to allocate a stack frame, and most critically,
+ ; for it to not trust esp on return from TerminateProcess().
+ ; __declspec(noinline) can prevent inlining and #pragma optimize("y", off) can
+ ; disable frame pointer omission, but there’s no way to force a C compiler to
+ ; distrust esp, and even if there was a way, it’d probably be fragile.
+
+ push ebp
+ mov ebp, esp
+
+ push [ebp+12]
+ push [ebp+8]
+ call dword ptr [__imp__TerminateProcess@8]
+
+ ; Convert from BOOL to bool.
+ test eax, eax
+ setne al
+
+ ; TerminateProcess() is supposed to be stdcall (callee clean-up), and esp and
+ ; ebp are expected to already be equal. But if it’s been patched badly by
+ ; something that’s cdecl (caller clean-up), this next move will get things
+ ; back on track.
+ mov esp, ebp
+ pop ebp
+
+ ret
+
+SAFETERMINATEPROCESS_SYMBOL endp
+
+_TEXT ends
+
+endif
+
+end

Powered by Google App Engine
This is Rietveld 408576698