gdb_server: Don't modify "buf" argument in decode_xfer_read()

Make a temporary copy of argument "buf" before modifying it.
This requires also returning annex as copy of "buf".

This change is necessary in order to make packet[] "const".

Change-Id: I41eddc2edba1a88384aa7f5591fe50f6ee6a135c
Signed-off-by: Christian Eggers <ceggers@gmx.de>
---
Changelog:
v4:
- Initialize annex to NULL
v3:
- Return "annex" as copy instead of removing it.
Reviewed-on: http://openocd.zylin.com/1924
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
__archive__
Christian Eggers 2014-02-14 21:43:53 +01:00 committed by Spencer Oliver
parent 6fcaa4ae8f
commit 537b06a810
1 changed files with 21 additions and 8 deletions

View File

@ -1669,29 +1669,41 @@ static void xml_printf(int *retval, char **xml, int *pos, int *size,
} }
} }
static int decode_xfer_read(char *buf, char **annex, int *ofs, unsigned int *len) static int decode_xfer_read(char *_buf, char **annex, int *ofs, unsigned int *len)
{ {
int ret = 0;
char *buf = strdup(_buf);
char *_annex;
char *separator; char *separator;
/* Extract and NUL-terminate the annex. */ /* Extract and NUL-terminate the annex. */
*annex = buf; _annex = buf;
while (*buf && *buf != ':') while (*buf && *buf != ':')
buf++; buf++;
if (*buf == '\0') if (*buf == '\0') {
return -1; ret = -1;
goto out;
}
*buf++ = 0; *buf++ = 0;
/* Return annex as copy because "buf" will be freed in this function */
*annex = strdup(_annex);
/* After the read marker and annex, qXfer looks like a /* After the read marker and annex, qXfer looks like a
* traditional 'm' packet. */ * traditional 'm' packet. */
*ofs = strtoul(buf, &separator, 16); *ofs = strtoul(buf, &separator, 16);
if (*separator != ',') if (*separator != ',') {
return -1; ret = -1;
goto out;
}
*len = strtoul(separator + 1, NULL, 16); *len = strtoul(separator + 1, NULL, 16);
return 0; out:
free(buf);
return ret;
} }
static int compare_bank(const void *a, const void *b) static int compare_bank(const void *a, const void *b)
@ -2364,7 +2376,7 @@ static int gdb_query_packet(struct connection *connection,
int offset; int offset;
unsigned int length; unsigned int length;
char *annex; char *annex = NULL;
/* skip command character */ /* skip command character */
packet += 20; packet += 20;
@ -2373,6 +2385,7 @@ static int gdb_query_packet(struct connection *connection,
gdb_send_error(connection, 01); gdb_send_error(connection, 01);
return ERROR_OK; return ERROR_OK;
} }
free(annex);
/* Target should prepare correct target description for annex. /* Target should prepare correct target description for annex.
* The first character of returned xml is 'm' or 'l'. 'm' for * The first character of returned xml is 'm' or 'l'. 'm' for