From 6740dc9c3e1fbc0f2ae2cb54feee654023db157d Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 24 May 2013 11:28:06 +0000 Subject: [PATCH] [gdbserver] Don't assume vCont;r ADDR1,ADDR2 comes with a ptid attached. This bit: + p1 = strchr (p, ':'); + decode_address (&resume_info[i].step_range_end, p, p1 - p); should not expect the ':' to be there. An action without a ptid is valid: "If an action is specified with no thread-id, then it is applied to any threads that don't have a specific action specified" This is handled further below: if (p[0] == 0) { resume_info[i].thread = minus_one_ptid; default_action = resume_info[i]; /* Note: we don't increment i here, we'll overwrite this entry the next time through. */ } else if (p[0] == ':') A stub that doesn't support and report to gdb thread ids at all (like metal metal targets) only will always only see a single default action with no ptid. Use unpack_varlen_hex instead of decode_address. The former doesn't need to be told where the hex number ends, and it actually returns that info instead, which we can use for validation. Tested on x86_64 Fedora 17. gdb/gdbserver/ 2013-05-24 Pedro Alves * server.c (handle_v_cont) : Use unpack_varlen_hex instead of strchr/decode_address. Error if the range isn't split with a ','. Don't assume there's be a ':' in the action. --- gdb/gdbserver/ChangeLog | 6 ++++++ gdb/gdbserver/server.c | 15 +++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 0af0bb8..f050bfa 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2013-05-24 Pedro Alves + + * server.c (handle_v_cont) : Use unpack_varlen_hex + instead of strchr/decode_address. Error if the range isn't split + with a ','. Don't assume there's be a ':' in the action. + 2013-05-23 Yao Qi Pedro Alves diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 1083aa9..d9daf84 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -2069,17 +2069,16 @@ handle_v_cont (char *own_buf) } else if (p[0] == 'r') { - char *p1; + ULONGEST addr; - p = p + 1; - p1 = strchr (p, ','); - decode_address (&resume_info[i].step_range_start, p, p1 - p); + p = unpack_varlen_hex (p + 1, &addr); + resume_info[i].step_range_start = addr; - p = p1 + 1; - p1 = strchr (p, ':'); - decode_address (&resume_info[i].step_range_end, p, p1 - p); + if (*p != ',') + goto err; - p = p1; + p = unpack_varlen_hex (p + 1, &addr); + resume_info[i].step_range_end = addr; } else { -- 2.7.4