https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3ee1eb42a5ec447df568d8dd7d9ba69d96282e47

commit 3ee1eb42a5ec447df568d8dd7d9ba69d96282e47
Author:     Jérôme Gardou <jerome.gar...@reactos.org>
AuthorDate: Fri Apr 23 15:26:33 2021 +0200
Commit:     Jérôme Gardou <zefk...@users.noreply.github.com>
CommitDate: Wed Apr 28 13:10:23 2021 +0200

    [KDGDB] Avoid looping for ever when something unexpected happens
---
 drivers/base/kdgdb/gdb_input.c | 25 +++++++++++++++++--------
 drivers/base/kdgdb/kdgdb.h     |  2 +-
 drivers/base/kdgdb/kdpacket.c  | 36 +++++++++++++++---------------------
 3 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/drivers/base/kdgdb/gdb_input.c b/drivers/base/kdgdb/gdb_input.c
index 23f030686d4..c10d7750c84 100644
--- a/drivers/base/kdgdb/gdb_input.c
+++ b/drivers/base/kdgdb/gdb_input.c
@@ -430,7 +430,7 @@ handle_gdb_registers(
 #endif
 
 static
-void
+BOOLEAN
 ReadMemorySendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -442,12 +442,13 @@ ReadMemorySendHandler(
     {
         // KdAssert
         KDDBGPRINT("Wrong packet type (%lu) received after 
DbgKdReadVirtualMemoryApi request.\n", PacketType);
-        while (1);
+        return FALSE;
     }
 
     if (State->ApiNumber != DbgKdReadVirtualMemoryApi)
     {
         KDDBGPRINT("Wrong API number (%lu) after DbgKdReadVirtualMemoryApi 
request.\n", State->ApiNumber);
+        return FALSE;
     }
 
     /* Check status. Allow to send partial data. */
@@ -469,6 +470,8 @@ ReadMemorySendHandler(
         if (ProcessListHead->Flink)
             __writecr3(PsGetCurrentProcess()->Pcb.DirectoryTableBase[0]);
     }
+
+    return TRUE;
 }
 
 static
@@ -531,7 +534,7 @@ handle_gdb_read_mem(
 }
 
 static
-void
+BOOLEAN
 WriteMemorySendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -543,12 +546,13 @@ WriteMemorySendHandler(
     {
         // KdAssert
         KDDBGPRINT("Wrong packet type (%lu) received after 
DbgKdWriteVirtualMemoryApi request.\n", PacketType);
-        while (1);
+        return FALSE;
     }
 
     if (State->ApiNumber != DbgKdWriteVirtualMemoryApi)
     {
         KDDBGPRINT("Wrong API number (%lu) after DbgKdWriteVirtualMemoryApi 
request.\n", State->ApiNumber);
+        return FALSE;
     }
 
     /* Check status */
@@ -570,6 +574,7 @@ WriteMemorySendHandler(
         if (ProcessListHead->Flink)
             __writecr3(PsGetCurrentProcess()->Pcb.DirectoryTableBase[0]);
     }
+    return TRUE;
 }
 
 static
@@ -669,7 +674,7 @@ handle_gdb_write_mem(
 }
 
 static
-void
+BOOLEAN
 WriteBreakPointSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -681,12 +686,13 @@ WriteBreakPointSendHandler(
     {
         // KdAssert
         KDDBGPRINT("Wrong packet type (%lu) received after 
DbgKdWriteBreakPointApi request.\n", PacketType);
-        while (1);
+        return FALSE;
     }
 
     if (State->ApiNumber != DbgKdWriteBreakPointApi)
     {
         KDDBGPRINT("Wrong API number (%lu) after DbgKdWriteBreakPointApi 
request.\n", State->ApiNumber);
+        return FALSE;
     }
 
     /* Check status */
@@ -712,6 +718,7 @@ WriteBreakPointSendHandler(
     }
     KdpSendPacketHandler = NULL;
     KdpManipulateStateHandler = NULL;
+    return TRUE;
 }
 
 static
@@ -767,7 +774,7 @@ handle_gdb_insert_breakpoint(
 }
 
 static
-void
+BOOLEAN
 RestoreBreakPointSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -780,12 +787,13 @@ RestoreBreakPointSendHandler(
     {
         // KdAssert
         KDDBGPRINT("Wrong packet type (%lu) received after 
DbgKdRestoreBreakPointApi request.\n", PacketType);
-        while (1);
+        return FALSE;
     }
 
     if (State->ApiNumber != DbgKdRestoreBreakPointApi)
     {
         KDDBGPRINT("Wrong API number (%lu) after DbgKdRestoreBreakPointApi 
request.\n", State->ApiNumber);
+        return FALSE;
     }
 
     /* We ignore failure here. If DbgKdRestoreBreakPointApi fails,
@@ -804,6 +812,7 @@ RestoreBreakPointSendHandler(
 
     KdpSendPacketHandler = NULL;
     KdpManipulateStateHandler = NULL;
+    return TRUE;
 }
 
 static
diff --git a/drivers/base/kdgdb/kdgdb.h b/drivers/base/kdgdb/kdgdb.h
index a260e570319..4e365b77e27 100644
--- a/drivers/base/kdgdb/kdgdb.h
+++ b/drivers/base/kdgdb/kdgdb.h
@@ -57,7 +57,7 @@ InitManipulateFromStateChange(
 }
 
 /* Callbacks to simulate a KdReceive <-> KdSend loop without GDB being aware 
of it */
-typedef VOID (*KDP_SEND_HANDLER)(
+typedef BOOLEAN (*KDP_SEND_HANDLER)(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
     _In_ PSTRING MessageData
diff --git a/drivers/base/kdgdb/kdpacket.c b/drivers/base/kdgdb/kdpacket.c
index dfe4ee7f261..ba5cd44dd25 100644
--- a/drivers/base/kdgdb/kdpacket.c
+++ b/drivers/base/kdgdb/kdpacket.c
@@ -9,7 +9,7 @@
 
 /* LOCALS 
*********************************************************************/
 static
-VOID
+BOOLEAN
 FirstSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -33,7 +33,7 @@ PETHREAD TheIdleThread;
 /* PRIVATE FUNCTIONS 
**********************************************************/
 
 static
-VOID
+BOOLEAN
 GetContextSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -47,14 +47,14 @@ GetContextSendHandler(
             || (State->ApiNumber != DbgKdGetContextApi)
             || (MessageData->Length < sizeof(*Context)))
     {
-        /* Should we bugcheck ? */
         KDDBGPRINT("ERROR: Received wrong packet from KD.\n");
-        while (1);
+        return FALSE;
     }
 
     /* Just copy it */
     RtlCopyMemory(&CurrentContext, Context, sizeof(*Context));
     KdpSendPacketHandler = NULL;
+    return TRUE;
 }
 
 static
@@ -80,7 +80,7 @@ GetContextManipulateHandler(
 }
 
 static
-VOID
+BOOLEAN
 SetContextSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -96,10 +96,11 @@ SetContextSendHandler(
     {
         /* Should we bugcheck ? */
         KDDBGPRINT("BAD BAD BAD not manipulating state for sending 
context.\n");
-        while (1);
+        return FALSE;
     }
 
     KdpSendPacketHandler = NULL;
+    return TRUE;
 }
 
 KDSTATUS
@@ -236,7 +237,7 @@ ContinueManipulateStateHandler(
 }
 
 static
-VOID
+BOOLEAN
 GetVersionSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -250,9 +251,8 @@ GetVersionSendHandler(
             || (State->ApiNumber != DbgKdGetVersionApi)
             || !NT_SUCCESS(State->ReturnStatus))
     {
-        /* FIXME: should detach from KD and go along without debugging */
         KDDBGPRINT("Wrong packet received after asking for data.\n");
-        while(1);
+        return FALSE;
     }
 
     /* Copy the relevant data */
@@ -265,6 +265,7 @@ GetVersionSendHandler(
     /* Now we can get the context for the current state */
     KdpSendPacketHandler = NULL;
     KdpManipulateStateHandler = GetContextManipulateHandler;
+    return TRUE;
 }
 
 static
@@ -288,7 +289,7 @@ GetVersionManipulateStateHandler(
 }
 
 static
-VOID
+BOOLEAN
 FirstSendHandler(
     _In_ ULONG PacketType,
     _In_ PSTRING MessageHeader,
@@ -297,18 +298,10 @@ FirstSendHandler(
     DBGKD_ANY_WAIT_STATE_CHANGE* StateChange = 
(DBGKD_ANY_WAIT_STATE_CHANGE*)MessageHeader->Buffer;
     PETHREAD Thread;
 
-    if (PacketType == PACKET_TYPE_KD_DEBUG_IO)
-    {
-        /* This is not the packet we are waiting for */
-        send_kd_debug_io((DBGKD_DEBUG_IO*)MessageHeader->Buffer, MessageData);
-        return;
-    }
-
     if (PacketType != PACKET_TYPE_KD_STATE_CHANGE64)
     {
         KDDBGPRINT("First KD packet is not a state change!\n");
-        /* FIXME: What should we send back to KD ? */
-        while(1);
+        return FALSE;
     }
 
     KDDBGPRINT("KDGDB: START!\n");
@@ -332,6 +325,7 @@ FirstSendHandler(
     /* The next receive call will be asking for the version data */
     KdpSendPacketHandler = NULL;
     KdpManipulateStateHandler = GetVersionManipulateStateHandler;
+    return TRUE;
 }
 
 /* PUBLIC FUNCTIONS 
***********************************************************/
@@ -426,9 +420,9 @@ KdSendPacket(
     }
 
     /* Maybe we are in a send <-> receive loop that GDB doesn't need to know 
about */
-    if (KdpSendPacketHandler)
+    if (KdpSendPacketHandler
+        && KdpSendPacketHandler(PacketType, MessageHeader, MessageData))
     {
-        KdpSendPacketHandler(PacketType, MessageHeader, MessageData);
         return;
     }
 

Reply via email to