diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 48 |
2 files changed, 39 insertions, 14 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index b7d0c0c..6d77af6 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2010-06-01 Pedro Alves <pedro@codesourcery.com> + + * server.c (handle_query) <qSupported>: Do two passes over the + qSupported string to avoid nesting strtok. + 2010-05-28 Jan Kratochvil <jan.kratochvil@redhat.com> * Makefile.in (SFILES): Add $(srcdir)/proc-service.list. diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 75b9d88..25845a7 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1346,20 +1346,40 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) feature will follow a ':', and latter features will follow ';'. */ if (*p == ':') - for (p = strtok (p + 1, ";"); - p != NULL; - p = strtok (NULL, ";")) - { - if (strcmp (p, "multiprocess+") == 0) - { - /* GDB supports and wants multi-process support if - possible. */ - if (target_supports_multi_process ()) - multi_process = 1; - } - else - target_process_qsupported (p); - } + { + char **qsupported = NULL; + int count = 0; + int i; + + /* Two passes, to avoid nested strtok calls in + target_process_qsupported. */ + for (p = strtok (p + 1, ";"); + p != NULL; + p = strtok (NULL, ";")) + { + count++; + qsupported = xrealloc (qsupported, count * sizeof (char *)); + qsupported[count - 1] = xstrdup (p); + } + + for (i = 0; i < count; i++) + { + p = qsupported[i]; + if (strcmp (p, "multiprocess+") == 0) + { + /* GDB supports and wants multi-process support if + possible. */ + if (target_supports_multi_process ()) + multi_process = 1; + } + else + target_process_qsupported (p); + + free (p); + } + + free (qsupported); + } sprintf (own_buf, "PacketSize=%x;QPassSignals+", PBUFSIZ - 1); |