Source code

Revision control

Copy as Markdown

Other Tools

changeset: 651272:ff2582aceafe
parent: 651260:b740f950e497
user: Gabriele Svelto <gsvelto@mozilla.com>
date: Thu Apr 08 12:01:43 2021 +0200
summary: fastfail
diff --git a/src/google_breakpad/common/minidump_exception_win32.h b/src/google_breakpad/common/minidump_exception_win32.h
--- a/src/google_breakpad/common/minidump_exception_win32.h
+++ b/src/google_breakpad/common/minidump_exception_win32.h
@@ -2261,9 +2261,84 @@ typedef enum {
// These constants are defined in the MSDN documentation of
// the EXCEPTION_RECORD structure.
typedef enum {
MD_IN_PAGE_ERROR_WIN_READ = 0,
MD_IN_PAGE_ERROR_WIN_WRITE = 1,
MD_IN_PAGE_ERROR_WIN_EXEC = 8
} MDInPageErrorTypeWin;
+/* For (MDException).exception_information[0], when (MDException).exception_code
+ * is MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN. This describes the underlying
+ * reason for the crash. These values come from winnt.h.
+ *
+ * The content of this enum was created from winnt.h in the 10 SDK
+ * (version 10.0.19041.0) with
+ *
+ * egrep '#define FAST_FAIL_[A-Z_0-9]+\s+[0-9]' winnt.h
+ * | tr -d '\r'
+ * | sed -r 's@#define FAST_FAIL_([A-Z_0-9]+)\s+([0-9]+).*@\2 \1@'
+ * | sed -r 's@([0-9]+) ([A-Z_0-9]+)@ MD_FAST_FAIL_WIN_\2 = \1,@' */
+typedef enum {
+ MD_FAST_FAIL_WIN_LEGACY_GS_VIOLATION = 0,
+ MD_FAST_FAIL_WIN_VTGUARD_CHECK_FAILURE = 1,
+ MD_FAST_FAIL_WIN_STACK_COOKIE_CHECK_FAILURE = 2,
+ MD_FAST_FAIL_WIN_CORRUPT_LIST_ENTRY = 3,
+ MD_FAST_FAIL_WIN_INCORRECT_STACK = 4,
+ MD_FAST_FAIL_WIN_INVALID_ARG = 5,
+ MD_FAST_FAIL_WIN_GS_COOKIE_INIT = 6,
+ MD_FAST_FAIL_WIN_FATAL_APP_EXIT = 7,
+ MD_FAST_FAIL_WIN_RANGE_CHECK_FAILURE = 8,
+ MD_FAST_FAIL_WIN_UNSAFE_REGISTRY_ACCESS = 9,
+ MD_FAST_FAIL_WIN_GUARD_ICALL_CHECK_FAILURE = 10,
+ MD_FAST_FAIL_WIN_GUARD_WRITE_CHECK_FAILURE = 11,
+ MD_FAST_FAIL_WIN_INVALID_FIBER_SWITCH = 12,
+ MD_FAST_FAIL_WIN_INVALID_SET_OF_CONTEXT = 13,
+ MD_FAST_FAIL_WIN_INVALID_REFERENCE_COUNT = 14,
+ MD_FAST_FAIL_WIN_INVALID_JUMP_BUFFER = 18,
+ MD_FAST_FAIL_WIN_MRDATA_MODIFIED = 19,
+ MD_FAST_FAIL_WIN_CERTIFICATION_FAILURE = 20,
+ MD_FAST_FAIL_WIN_INVALID_EXCEPTION_CHAIN = 21,
+ MD_FAST_FAIL_WIN_CRYPTO_LIBRARY = 22,
+ MD_FAST_FAIL_WIN_INVALID_CALL_IN_DLL_CALLOUT = 23,
+ MD_FAST_FAIL_WIN_INVALID_IMAGE_BASE = 24,
+ MD_FAST_FAIL_WIN_DLOAD_PROTECTION_FAILURE = 25,
+ MD_FAST_FAIL_WIN_UNSAFE_EXTENSION_CALL = 26,
+ MD_FAST_FAIL_WIN_DEPRECATED_SERVICE_INVOKED = 27,
+ MD_FAST_FAIL_WIN_INVALID_BUFFER_ACCESS = 28,
+ MD_FAST_FAIL_WIN_INVALID_BALANCED_TREE = 29,
+ MD_FAST_FAIL_WIN_INVALID_NEXT_THREAD = 30,
+ MD_FAST_FAIL_WIN_GUARD_ICALL_CHECK_SUPPRESSED = 31,
+ MD_FAST_FAIL_WIN_APCS_DISABLED = 32,
+ MD_FAST_FAIL_WIN_INVALID_IDLE_STATE = 33,
+ MD_FAST_FAIL_WIN_MRDATA_PROTECTION_FAILURE = 34,
+ MD_FAST_FAIL_WIN_UNEXPECTED_HEAP_EXCEPTION = 35,
+ MD_FAST_FAIL_WIN_INVALID_LOCK_STATE = 36,
+ MD_FAST_FAIL_WIN_GUARD_JUMPTABLE = 37,
+ MD_FAST_FAIL_WIN_INVALID_LONGJUMP_TARGET = 38,
+ MD_FAST_FAIL_WIN_INVALID_DISPATCH_CONTEXT = 39,
+ MD_FAST_FAIL_WIN_INVALID_THREAD = 40,
+ MD_FAST_FAIL_WIN_INVALID_SYSCALL_NUMBER = 41,
+ MD_FAST_FAIL_WIN_INVALID_FILE_OPERATION = 42,
+ MD_FAST_FAIL_WIN_LPAC_ACCESS_DENIED = 43,
+ MD_FAST_FAIL_WIN_GUARD_SS_FAILURE = 44,
+ MD_FAST_FAIL_WIN_LOADER_CONTINUITY_FAILURE = 45,
+ MD_FAST_FAIL_WIN_GUARD_EXPORT_SUPPRESSION_FAILURE = 46,
+ MD_FAST_FAIL_WIN_INVALID_CONTROL_STACK = 47,
+ MD_FAST_FAIL_WIN_SET_CONTEXT_DENIED = 48,
+ MD_FAST_FAIL_WIN_INVALID_IAT = 49,
+ MD_FAST_FAIL_WIN_HEAP_METADATA_CORRUPTION = 50,
+ MD_FAST_FAIL_WIN_PAYLOAD_RESTRICTION_VIOLATION = 51,
+ MD_FAST_FAIL_WIN_LOW_LABEL_ACCESS_DENIED = 52,
+ MD_FAST_FAIL_WIN_ENCLAVE_CALL_FAILURE = 53,
+ MD_FAST_FAIL_WIN_UNHANDLED_LSS_EXCEPTON = 54,
+ MD_FAST_FAIL_WIN_ADMINLESS_ACCESS_DENIED = 55,
+ MD_FAST_FAIL_WIN_UNEXPECTED_CALL = 56,
+ MD_FAST_FAIL_WIN_CONTROL_INVALID_RETURN_ADDRESS = 57,
+ MD_FAST_FAIL_WIN_UNEXPECTED_HOST_BEHAVIOR = 58,
+ MD_FAST_FAIL_WIN_FLAGS_CORRUPTION = 59,
+ MD_FAST_FAIL_WIN_VEH_CORRUPTION = 60,
+ MD_FAST_FAIL_WIN_ETW_CORRUPTION = 61,
+ MD_FAST_FAIL_WIN_RIO_ABORT = 62,
+ MD_FAST_FAIL_WIN_INVALID_PFN = 63,
+} MDFastFailWin;
+
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */
diff --git a/src/processor/minidump_processor.cc b/src/processor/minidump_processor.cc
--- a/src/processor/minidump_processor.cc
+++ b/src/processor/minidump_processor.cc
@@ -1288,16 +1288,24 @@ string MinidumpProcessor::GetCrashReason
case MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE:
reason = "EXCEPTION_BAD_FUNCTION_TABLE";
break;
case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:
reason = "EXCEPTION_POSSIBLE_DEADLOCK";
break;
case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:
reason = "EXCEPTION_STACK_BUFFER_OVERRUN";
+ if (raw_exception->exception_record.number_parameters > 0) {
+ uint32_t fast_fail_code =
+ static_cast<uint32_t>
+ (raw_exception->exception_record.exception_information[0]);
+ reason.append(" / ");
+ reason.append(FastFailToString(fast_fail_code));
+ }
+
break;
case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:
reason = "EXCEPTION_HEAP_CORRUPTION";
break;
case MD_EXCEPTION_OUT_OF_MEMORY:
reason = "Out of Memory";
break;
case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:
diff --git a/src/processor/symbolic_constants_win.cc b/src/processor/symbolic_constants_win.cc
--- a/src/processor/symbolic_constants_win.cc
+++ b/src/processor/symbolic_constants_win.cc
@@ -6409,9 +6409,214 @@ string NTStatusToString(uint32_t ntstatu
snprintf(reason_string, sizeof(reason_string), "0x%08x", ntstatus);
reason = reason_string;
break;
}
}
return reason;
}
+string FastFailToString(uint32_t fast_fail_code) {
+ string code_string;
+ // The content of this switch was created from winnt.h in the 10 SDK
+ // (version 10.0.19041.0) with
+ //
+ // egrep '#define FAST_FAIL_[A-Z_0-9]+\s+[0-9]' winnt.h
+ // | tr -d '\r'
+ // | sed -r 's@#define FAST_FAIL_([A-Z_0-9]+)\s+([0-9]+).*@\2 \1@'
+ // | sed -r 's@([0-9]+) ([A-Z_0-9]+)@ case MD_FAST_FAIL_WIN_\2:\n code_string = "FAST_FAIL_\2";\n break;@'
+ //
+ // and then the default case added.
+ switch (fast_fail_code) {
+ case MD_FAST_FAIL_WIN_LEGACY_GS_VIOLATION:
+ code_string = "FAST_FAIL_LEGACY_GS_VIOLATION";
+ break;
+ case MD_FAST_FAIL_WIN_VTGUARD_CHECK_FAILURE:
+ code_string = "FAST_FAIL_VTGUARD_CHECK_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_STACK_COOKIE_CHECK_FAILURE:
+ code_string = "FAST_FAIL_STACK_COOKIE_CHECK_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_CORRUPT_LIST_ENTRY:
+ code_string = "FAST_FAIL_CORRUPT_LIST_ENTRY";
+ break;
+ case MD_FAST_FAIL_WIN_INCORRECT_STACK:
+ code_string = "FAST_FAIL_INCORRECT_STACK";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_ARG:
+ code_string = "FAST_FAIL_INVALID_ARG";
+ break;
+ case MD_FAST_FAIL_WIN_GS_COOKIE_INIT:
+ code_string = "FAST_FAIL_GS_COOKIE_INIT";
+ break;
+ case MD_FAST_FAIL_WIN_FATAL_APP_EXIT:
+ code_string = "FAST_FAIL_FATAL_APP_EXIT";
+ break;
+ case MD_FAST_FAIL_WIN_RANGE_CHECK_FAILURE:
+ code_string = "FAST_FAIL_RANGE_CHECK_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_UNSAFE_REGISTRY_ACCESS:
+ code_string = "FAST_FAIL_UNSAFE_REGISTRY_ACCESS";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_ICALL_CHECK_FAILURE:
+ code_string = "FAST_FAIL_GUARD_ICALL_CHECK_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_WRITE_CHECK_FAILURE:
+ code_string = "FAST_FAIL_GUARD_WRITE_CHECK_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_FIBER_SWITCH:
+ code_string = "FAST_FAIL_INVALID_FIBER_SWITCH";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_SET_OF_CONTEXT:
+ code_string = "FAST_FAIL_INVALID_SET_OF_CONTEXT";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_REFERENCE_COUNT:
+ code_string = "FAST_FAIL_INVALID_REFERENCE_COUNT";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_JUMP_BUFFER:
+ code_string = "FAST_FAIL_INVALID_JUMP_BUFFER";
+ break;
+ case MD_FAST_FAIL_WIN_MRDATA_MODIFIED:
+ code_string = "FAST_FAIL_MRDATA_MODIFIED";
+ break;
+ case MD_FAST_FAIL_WIN_CERTIFICATION_FAILURE:
+ code_string = "FAST_FAIL_CERTIFICATION_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_EXCEPTION_CHAIN:
+ code_string = "FAST_FAIL_INVALID_EXCEPTION_CHAIN";
+ break;
+ case MD_FAST_FAIL_WIN_CRYPTO_LIBRARY:
+ code_string = "FAST_FAIL_CRYPTO_LIBRARY";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_CALL_IN_DLL_CALLOUT:
+ code_string = "FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_IMAGE_BASE:
+ code_string = "FAST_FAIL_INVALID_IMAGE_BASE";
+ break;
+ case MD_FAST_FAIL_WIN_DLOAD_PROTECTION_FAILURE:
+ code_string = "FAST_FAIL_DLOAD_PROTECTION_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_UNSAFE_EXTENSION_CALL:
+ code_string = "FAST_FAIL_UNSAFE_EXTENSION_CALL";
+ break;
+ case MD_FAST_FAIL_WIN_DEPRECATED_SERVICE_INVOKED:
+ code_string = "FAST_FAIL_DEPRECATED_SERVICE_INVOKED";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_BUFFER_ACCESS:
+ code_string = "FAST_FAIL_INVALID_BUFFER_ACCESS";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_BALANCED_TREE:
+ code_string = "FAST_FAIL_INVALID_BALANCED_TREE";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_NEXT_THREAD:
+ code_string = "FAST_FAIL_INVALID_NEXT_THREAD";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_ICALL_CHECK_SUPPRESSED:
+ code_string = "FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED";
+ break;
+ case MD_FAST_FAIL_WIN_APCS_DISABLED:
+ code_string = "FAST_FAIL_APCS_DISABLED";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_IDLE_STATE:
+ code_string = "FAST_FAIL_INVALID_IDLE_STATE";
+ break;
+ case MD_FAST_FAIL_WIN_MRDATA_PROTECTION_FAILURE:
+ code_string = "FAST_FAIL_MRDATA_PROTECTION_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_UNEXPECTED_HEAP_EXCEPTION:
+ code_string = "FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_LOCK_STATE:
+ code_string = "FAST_FAIL_INVALID_LOCK_STATE";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_JUMPTABLE:
+ code_string = "FAST_FAIL_GUARD_JUMPTABLE";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_LONGJUMP_TARGET:
+ code_string = "FAST_FAIL_INVALID_LONGJUMP_TARGET";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_DISPATCH_CONTEXT:
+ code_string = "FAST_FAIL_INVALID_DISPATCH_CONTEXT";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_THREAD:
+ code_string = "FAST_FAIL_INVALID_THREAD";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_SYSCALL_NUMBER:
+ code_string = "FAST_FAIL_INVALID_SYSCALL_NUMBER";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_FILE_OPERATION:
+ code_string = "FAST_FAIL_INVALID_FILE_OPERATION";
+ break;
+ case MD_FAST_FAIL_WIN_LPAC_ACCESS_DENIED:
+ code_string = "FAST_FAIL_LPAC_ACCESS_DENIED";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_SS_FAILURE:
+ code_string = "FAST_FAIL_GUARD_SS_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_LOADER_CONTINUITY_FAILURE:
+ code_string = "FAST_FAIL_LOADER_CONTINUITY_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_GUARD_EXPORT_SUPPRESSION_FAILURE:
+ code_string = "FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_CONTROL_STACK:
+ code_string = "FAST_FAIL_INVALID_CONTROL_STACK";
+ break;
+ case MD_FAST_FAIL_WIN_SET_CONTEXT_DENIED:
+ code_string = "FAST_FAIL_SET_CONTEXT_DENIED";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_IAT:
+ code_string = "FAST_FAIL_INVALID_IAT";
+ break;
+ case MD_FAST_FAIL_WIN_HEAP_METADATA_CORRUPTION:
+ code_string = "FAST_FAIL_HEAP_METADATA_CORRUPTION";
+ break;
+ case MD_FAST_FAIL_WIN_PAYLOAD_RESTRICTION_VIOLATION:
+ code_string = "FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION";
+ break;
+ case MD_FAST_FAIL_WIN_LOW_LABEL_ACCESS_DENIED:
+ code_string = "FAST_FAIL_LOW_LABEL_ACCESS_DENIED";
+ break;
+ case MD_FAST_FAIL_WIN_ENCLAVE_CALL_FAILURE:
+ code_string = "FAST_FAIL_ENCLAVE_CALL_FAILURE";
+ break;
+ case MD_FAST_FAIL_WIN_UNHANDLED_LSS_EXCEPTON:
+ code_string = "FAST_FAIL_UNHANDLED_LSS_EXCEPTON";
+ break;
+ case MD_FAST_FAIL_WIN_ADMINLESS_ACCESS_DENIED:
+ code_string = "FAST_FAIL_ADMINLESS_ACCESS_DENIED";
+ break;
+ case MD_FAST_FAIL_WIN_UNEXPECTED_CALL:
+ code_string = "FAST_FAIL_UNEXPECTED_CALL";
+ break;
+ case MD_FAST_FAIL_WIN_CONTROL_INVALID_RETURN_ADDRESS:
+ code_string = "FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS";
+ break;
+ case MD_FAST_FAIL_WIN_UNEXPECTED_HOST_BEHAVIOR:
+ code_string = "FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR";
+ break;
+ case MD_FAST_FAIL_WIN_FLAGS_CORRUPTION:
+ code_string = "FAST_FAIL_FLAGS_CORRUPTION";
+ break;
+ case MD_FAST_FAIL_WIN_VEH_CORRUPTION:
+ code_string = "FAST_FAIL_VEH_CORRUPTION";
+ break;
+ case MD_FAST_FAIL_WIN_ETW_CORRUPTION:
+ code_string = "FAST_FAIL_ETW_CORRUPTION";
+ break;
+ case MD_FAST_FAIL_WIN_RIO_ABORT:
+ code_string = "FAST_FAIL_RIO_ABORT";
+ break;
+ case MD_FAST_FAIL_WIN_INVALID_PFN:
+ code_string = "FAST_FAIL_INVALID_PFN";
+ break;
+ default: {
+ char buffer[11];
+ snprintf(buffer, sizeof(buffer), "%u", fast_fail_code);
+ code_string = buffer;
+ break;
+ }
+ }
+ return code_string;
+}
+
} // namespace google_breakpad
diff --git a/src/processor/symbolic_constants_win.h b/src/processor/symbolic_constants_win.h
--- a/src/processor/symbolic_constants_win.h
+++ b/src/processor/symbolic_constants_win.h
@@ -41,11 +41,14 @@
#include "common/using_std_string.h"
#include "google_breakpad/common/breakpad_types.h"
namespace google_breakpad {
/* Converts a NTSTATUS code to a reason string. */
string NTStatusToString(uint32_t ntstatus);
+/* Converts a FAST_FAIL code to a reason string. */
+string FastFailToString(uint32_t fast_fail_code);
+
} // namespace google_breakpad
#endif // GOOGLE_BREAKPAD_PROCESSOR_SYMBOLIC_CONSTANTS_WIN_H_