[gdbserver] Don't assume vCont;r ADDR1,ADDR2 comes with a ptid attached.
authorPedro Alves <palves@redhat.com>
Fri, 24 May 2013 11:28:06 +0000 (11:28 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 24 May 2013 11:28:06 +0000 (11:28 +0000)
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  <palves@redhat.com>

* server.c (handle_v_cont) <vCont;r>: 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
gdb/gdbserver/server.c

index 0af0bb82dff680955535d66f4fd78966510bc814..f050bfa4033be1766e438c56e272e5d1d4dc7ee1 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-24  Pedro Alves  <palves@redhat.com>
+
+       * server.c (handle_v_cont) <vCont;r>: 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  <yao@codesourcery.com>
            Pedro Alves  <palves@redhat.com>
 
index 1083aa9e56e08a0c2895f1005531a6622cce3523..d9daf8475e3581cef2b7881163fd359daccbf71f 100644 (file)
@@ -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
        {