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__
parent
6fcaa4ae8f
commit
537b06a810
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue