зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1703248 - Print the exception subcode of EXCEPTION_STACK_BUFFER_OVERRUN crashes r=KrisWright
This is the crashes that are usually caused by a __fastfail() invocation Differential Revision: https://phabricator.services.mozilla.com/D111242
This commit is contained in:
Родитель
321a9bce6b
Коммит
e1c41f5dac
|
@ -0,0 +1,359 @@
|
|||
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_
|
||||
|
|
@ -2266,4 +2266,79 @@ typedef enum {
|
|||
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__ */
|
||||
|
|
|
@ -1293,6 +1293,14 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, uint64_t *address) {
|
|||
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";
|
||||
|
|
|
@ -6414,4 +6414,209 @@ string NTStatusToString(uint32_t ntstatus) {
|
|||
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
|
||||
|
|
|
@ -46,6 +46,9 @@ 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_
|
||||
|
|
Загрузка…
Ссылка в новой задаче