aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2013-02-19 20:52:57 +0000
committerPedro Alves <palves@redhat.com>2013-02-19 20:52:57 +0000
commitaca2255198cca90893ab2ceb8f0a13854b6fc0fc (patch)
tree3fe2655199e30db928cc57047efe9a087d380d8b
parent61a672f17d6544eb69a59aaed93c9eafdba74613 (diff)
downloadgdb-aca2255198cca90893ab2ceb8f0a13854b6fc0fc.zip
gdb-aca2255198cca90893ab2ceb8f0a13854b6fc0fc.tar.gz
gdb-aca2255198cca90893ab2ceb8f0a13854b6fc0fc.tar.bz2
gdbserver:server.c - use unpack_varlen_hex to extract hex numbers.
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.
-rw-r--r--gdb/gdbserver/ChangeLog9
-rw-r--r--gdb/gdbserver/server.c13
2 files changed, 17 insertions, 5 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index eba9cec..88cd101 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -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.
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 775d9ef..371647c 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -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;