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.
This commit is contained in:
Pedro Alves 2013-02-19 20:52:57 +00:00
parent 61a672f17d
commit aca2255198
2 changed files with 17 additions and 5 deletions

View 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.

View 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;