From 26d56a939e9e54e09d46ea6e9678463ac344fa33 Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Tue, 18 Aug 2015 10:29:54 -0700 Subject: Fix mis-parsing of hex register numbers in 'T' stop replies. 2015-08-18 Sandra Loosemore gdb/ * remote.c (strprefix): New. (remote_parse_stop_reply): Use strprefix instead of strncmp to ensure exact match of keyword. --- gdb/ChangeLog | 6 ++++++ gdb/remote.c | 36 ++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 51bae87..4af881e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-08-18 Sandra Loosemore + + * remote.c (strprefix): New. + (remote_parse_stop_reply): Use strprefix instead of strncmp + to ensure exact match of keyword. + 2015-08-18 Andrew Burgess * gdb_bfd.c (debug_bfd_cache): New variable. diff --git a/gdb/remote.c b/gdb/remote.c index ca1f0df..4e483fd 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5835,6 +5835,18 @@ skip_to_semicolon (char *p) return p; } +/* Helper for remote_parse_stop_reply. Return nonzero if the substring + starting with P and ending with PEND matches PREFIX. */ + +static int +strprefix (const char *p, const char *pend, const char *prefix) +{ + for ( ; p < pend; p++, prefix++) + if (*p != *prefix) + return 0; + return *prefix == '\0'; +} + /* Parse the stop reply in BUF. Either the function succeeds, and the result is stored in EVENT, or throws an error. */ @@ -5886,17 +5898,17 @@ Packet: '%s'\n"), the server only sends such a packet if it knows the client understands it. */ - if (strncmp (p, "thread", p1 - p) == 0) + if (strprefix (p, p1, "thread")) event->ptid = read_ptid (++p1, &p); - else if ((strncmp (p, "watch", p1 - p) == 0) - || (strncmp (p, "rwatch", p1 - p) == 0) - || (strncmp (p, "awatch", p1 - p) == 0)) + else if (strprefix (p, p1, "watch") + || strprefix (p, p1, "rwatch") + || strprefix (p, p1, "awatch")) { event->stop_reason = TARGET_STOPPED_BY_WATCHPOINT; p = unpack_varlen_hex (++p1, &addr); event->watch_data_address = (CORE_ADDR) addr; } - else if (strncmp (p, "swbreak", p1 - p) == 0) + else if (strprefix (p, p1, "swbreak")) { event->stop_reason = TARGET_STOPPED_BY_SW_BREAKPOINT; @@ -5910,7 +5922,7 @@ Packet: '%s'\n"), use of it in a backward compatible way. */ p = skip_to_semicolon (p1 + 1); } - else if (strncmp (p, "hwbreak", p1 - p) == 0) + else if (strprefix (p, p1, "hwbreak")) { event->stop_reason = TARGET_STOPPED_BY_HW_BREAKPOINT; @@ -5922,36 +5934,36 @@ Packet: '%s'\n"), /* See above. */ p = skip_to_semicolon (p1 + 1); } - else if (strncmp (p, "library", p1 - p) == 0) + else if (strprefix (p, p1, "library")) { event->ws.kind = TARGET_WAITKIND_LOADED; p = skip_to_semicolon (p1 + 1); } - else if (strncmp (p, "replaylog", p1 - p) == 0) + else if (strprefix (p, p1, "replaylog")) { event->ws.kind = TARGET_WAITKIND_NO_HISTORY; /* p1 will indicate "begin" or "end", but it makes no difference for now, so ignore it. */ p = skip_to_semicolon (p1 + 1); } - else if (strncmp (p, "core", p1 - p) == 0) + else if (strprefix (p, p1, "core")) { ULONGEST c; p = unpack_varlen_hex (++p1, &c); event->core = c; } - else if (strncmp (p, "fork", p1 - p) == 0) + else if (strprefix (p, p1, "fork")) { event->ws.value.related_pid = read_ptid (++p1, &p); event->ws.kind = TARGET_WAITKIND_FORKED; } - else if (strncmp (p, "vfork", p1 - p) == 0) + else if (strprefix (p, p1, "vfork")) { event->ws.value.related_pid = read_ptid (++p1, &p); event->ws.kind = TARGET_WAITKIND_VFORKED; } - else if (strncmp (p, "vforkdone", p1 - p) == 0) + else if (strprefix (p, p1, "vforkdone")) { event->ws.kind = TARGET_WAITKIND_VFORK_DONE; p = skip_to_semicolon (p1 + 1); -- cgit v1.1