https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7b95fcf93d5ec38edd442492ec66459175f81106
commit 7b95fcf93d5ec38edd442492ec66459175f81106 Author: Thomas Faber <[email protected]> AuthorDate: Tue Dec 12 12:44:44 2017 +0100 [NTOS:KD] Avoid _alloca inside SEH, as it's apparently incompatible with PSEH. CORE-14103 --- ntoskrnl/kd/kdio.c | 5 +++-- ntoskrnl/kd64/kdprint.c | 10 +++++----- ntoskrnl/kdbg/kdb_cli.c | 10 ++++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ntoskrnl/kd/kdio.c b/ntoskrnl/kd/kdio.c index 205842056f..50e4d8168f 100644 --- a/ntoskrnl/kd/kdio.c +++ b/ntoskrnl/kd/kdio.c @@ -574,17 +574,18 @@ KdpPrintString( PLIST_ENTRY CurrentEntry; PKD_DISPATCH_TABLE CurrentTable; PCHAR String; + CHAR StringBuffer[512]; if (!KdpDebugMode.Value) return 0; - Length = min(Length, 512); + Length = min(Length, sizeof(StringBuffer)); if (ExGetPreviousMode() != KernelMode) { _SEH2_TRY { ProbeForRead(UnsafeString, Length, 1); - String = _alloca(Length); + String = StringBuffer; RtlCopyMemory(String, UnsafeString, Length); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) diff --git a/ntoskrnl/kd64/kdprint.c b/ntoskrnl/kd64/kdprint.c index 71a681d6e7..7604a255ab 100644 --- a/ntoskrnl/kd64/kdprint.c +++ b/ntoskrnl/kd64/kdprint.c @@ -220,14 +220,15 @@ KdpPrompt(IN LPSTR PromptString, { STRING PromptBuffer, ResponseBuffer; BOOLEAN Enable, Resend; - PVOID CapturedPrompt; + CHAR CapturedPrompt[512]; + CHAR SafeResponseBuffer[512]; PCHAR SafeResponseString; /* Normalize the lengths */ PromptLength = min(PromptLength, - 512); + sizeof(CapturedPrompt)); MaximumResponseLength = min(MaximumResponseLength, - 512); + sizeof(SafeResponseBuffer)); /* Check if we need to verify the string */ if (PreviousMode != KernelMode) @@ -241,7 +242,6 @@ KdpPrompt(IN LPSTR PromptString, 1); /* Capture prompt */ - CapturedPrompt = _alloca(PromptLength); KdpMoveMemory(CapturedPrompt, PromptString, PromptLength); @@ -251,7 +251,7 @@ KdpPrompt(IN LPSTR PromptString, ProbeForWrite(ResponseString, MaximumResponseLength, 1); - SafeResponseString = _alloca(MaximumResponseLength); + SafeResponseString = SafeResponseBuffer; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c index a2829e40ca..f5e71bd369 100644 --- a/ntoskrnl/kdbg/kdb_cli.c +++ b/ntoskrnl/kdbg/kdb_cli.c @@ -3675,12 +3675,14 @@ KdpPrompt( KIRQL OldIrql; PCHAR InString; PCHAR OutString; + CHAR InStringBuffer[512]; + CHAR OutStringBuffer[512]; /* Normalize the lengths */ InStringLength = min(InStringLength, - 512); + sizeof(InStringBuffer)); OutStringLength = min(OutStringLength, - 512); + sizeof(OutStringBuffer)); /* Check if we need to verify the string */ if (PreviousMode != KernelMode) @@ -3694,7 +3696,7 @@ KdpPrompt( 1); /* Capture prompt */ - InString = _alloca(InStringLength); + InString = InStringBuffer; RtlCopyMemory(InString, UnsafeInString, InStringLength); @@ -3703,7 +3705,7 @@ KdpPrompt( ProbeForWrite(UnsafeOutString, OutStringLength, 1); - OutString = _alloca(OutStringLength); + OutString = OutStringBuffer; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
