gdbserver:server.c - use unpack_varlen_hex to extract hex numbers.
authorPedro Alves <palves@redhat.com>
Tue, 19 Feb 2013 20:52:57 +0000 (20:52 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 19 Feb 2013 20:52:57 +0000 (20:52 +0000)
Addresses, as most numbers in the RSP are hex encoded, with variable
length (that just means the width isn't specified, and there's no top
cap.  So they should be extracted with unpack_varlen_hex.

A couple spots in server.c are using strto(u)l, which doesn't work on
LLP64 targets.

This patch fixes it.

Tested on x86_64 Fedora 17.

2013-02-19  Pedro Alves  <palves@redhat.com>
    Kai Tietz <ktietz@redhat.com>

PR gdb/15161

* server.c (handle_query) <CRC check>: Use unpack_varlen_hex
instead of strtoul to extract address from packet.
(process_serial_event) <'z'>: Likewise.

gdb/gdbserver/ChangeLog
gdb/gdbserver/server.c

index eba9cecb76b3b2ea04dbf4f809d6af1328437c40..88cd10116a19622cbc8966a97e425775bbc182d3 100644 (file)
@@ -1,3 +1,12 @@
+2013-02-19  Pedro Alves  <palves@redhat.com>
+           Kai Tietz <ktietz@redhat.com>
+
+       PR gdb/15161
+
+       * server.c (handle_query) <CRC check>: Use unpack_varlen_hex
+       instead of strtoul to extract address from packet.
+       (process_serial_event) <'z'>: Likewise.
+
 2013-02-18  Yao Qi  <yao@codesourcery.com>
 
        * linux-bfin-low.c (the_low_target): Use NULL instead of 0.
index 775d9efe0258c84b3b382e4cecebbff09c965cf0..371647c06660c9cbd4bf6a3d7b4be3925b7a82e5 100644 (file)
@@ -1808,12 +1808,12 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
     {
       /* CRC check (compare-section).  */
       char *comma;
-      CORE_ADDR base;
+      ULONGEST base;
       int len;
       unsigned long long crc;
 
       require_running (own_buf);
-      base = strtoul (own_buf + 5, &comma, 16);
+      comma = unpack_varlen_hex (own_buf + 5, &base);
       if (*comma++ != ',')
        {
          write_enn (own_buf);
@@ -3192,13 +3192,16 @@ process_serial_event (void)
       /* Fallthrough.  */
     case 'z':  /* remove_ ... */
       {
-       char *lenptr;
        char *dataptr;
-       CORE_ADDR addr = strtoul (&own_buf[3], &lenptr, 16);
-       int len = strtol (lenptr + 1, &dataptr, 16);
+       ULONGEST addr;
+       int len;
        char type = own_buf[1];
        int res;
        const int insert = ch == 'Z';
+       char *p = &own_buf[3];
+
+       p = unpack_varlen_hex (p, &addr);
+       len = strtol (p + 1, &dataptr, 16);
 
        /* Default to unrecognized/unsupported.  */
        res = 1;