[PATCH] Don't assert() on unsupported v-packets, but rather report an error

Eric Pouech eric.pouech at orange.fr
Wed Oct 5 15:41:10 CDT 2011


(#28566)

A+
---

 programs/winedbg/gdbproxy.c |   64 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 54 insertions(+), 10 deletions(-)


diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index e81f72c..1a30947 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -999,7 +999,7 @@ static enum packet_return packet_continue(struct gdb_context* gdbctx)
     return packet_reply_status(gdbctx);
 }
 
-static enum packet_return packet_verbose(struct gdb_context* gdbctx)
+static enum packet_return packet_verbose_cont(struct gdb_context* gdbctx)
 {
     int i;
     int defaultAction = -1; /* magic non action */
@@ -1012,9 +1012,6 @@ static enum packet_return packet_verbose(struct gdb_context* gdbctx)
     unsigned int threadID = 0;
     struct dbg_thread*  thd;
 
-    /* basic check */
-    assert(gdbctx->in_packet_len >= 4);
-
     /* OK we have vCont followed by..
     * ? for query
     * c for packet_continue
@@ -1024,11 +1021,6 @@ static enum packet_return packet_verbose(struct gdb_context* gdbctx)
     * and then an optional thread ID at the end..
     * *******************************************/
 
-    if (gdbctx->trace & GDBPXY_TRC_COMMAND)
-        fprintf(stderr, "trying to process a verbose packet\n");
-    /* now check that we've got Cont */
-    assert(strncmp(gdbctx->in_packet, "Cont", 4) == 0);
-
     /* Query */
     if (gdbctx->in_packet[4] == '?')
     {
@@ -1095,7 +1087,7 @@ static enum packet_return packet_verbose(struct gdb_context* gdbctx)
          * (they're running winedbg, so I'm sure they can fix the problem from the error message!) */
         if (threadCount == 100)
         {
-            fprintf(stderr, "Wow, that's a lot of threads, change threadIDs in wine/programms/winedgb/gdbproxy.c to be higher\n");
+            fprintf(stderr, "Wow, that's a lot of threads, change threadIDs in wine/programms/winedbg/gdbproxy.c to be higher\n");
             break;
         }
     }
@@ -1198,6 +1190,58 @@ static enum packet_return packet_verbose(struct gdb_context* gdbctx)
     return packet_reply_status(gdbctx);
 }
 
+struct verbose_defail
+{
+    const char*         name;
+    unsigned            len;
+    enum packet_return  (*handler)(struct gdb_context*);
+} verbose_details[] =
+{
+    /* {"Attach",           6}, */
+    {"Cont",             4, packet_verbose_cont},
+    /* {"File",             4},
+    {"FlashErase",      10},
+    {"FlashWrite",      10},
+    {"FlashDone",        9},
+    {"Kill",             4},
+    {"Run",              3},
+    {"Stopped",          7},*/
+};
+
+static enum packet_return packet_verbose(struct gdb_context* gdbctx)
+{
+    unsigned i;
+    unsigned klen;
+
+    for (klen = 0; ; klen++)
+    {
+        if (klen == gdbctx->in_packet_len ||
+            gdbctx->in_packet[klen] == ';' ||
+            gdbctx->in_packet[klen] == ':' ||
+            gdbctx->in_packet[klen] == '?')
+        {
+            if (gdbctx->trace & GDBPXY_TRC_COMMAND)
+                fprintf(stderr, "trying to process a verbose packet %*.*s\n",
+                        gdbctx->in_packet_len, gdbctx->in_packet_len, gdbctx->in_packet);
+            for (i = 0; i < sizeof(verbose_details)/sizeof(verbose_details[0]); i++)
+            {
+                if (klen == verbose_details[i].len &&
+                    !memcmp(gdbctx->in_packet, verbose_details[i].name, verbose_details[i].len))
+                {
+                    return verbose_details[i].handler(gdbctx);
+                }
+            }
+            /* no matching handler found, abort */
+            break;
+        }
+    }
+
+    if (gdbctx->trace & GDBPXY_TRC_COMMAND_FIXME)
+        fprintf(stderr, "No support for verbose packet %*.*s\n",
+                gdbctx->in_packet_len, gdbctx->in_packet_len, gdbctx->in_packet);
+    return packet_error;
+ }
+
 static enum packet_return packet_continue_signal(struct gdb_context* gdbctx)
 {
     unsigned char sig;




More information about the wine-patches mailing list