}
static int gdb_last_signal_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
struct gdb_connection *gdb_con = connection->priv;
/* copy over in register buffer */
static void gdb_target_to_reg(struct target *target,
- char *tstr, int str_len, uint8_t *bin)
+ char const *tstr, int str_len, uint8_t *bin)
{
if (str_len % 2) {
LOG_ERROR("BUG: gdb value with uneven number of characters encountered");
}
static int gdb_get_registers_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
struct reg **reg_list;
}
static int gdb_set_registers_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
int i;
struct reg **reg_list;
int reg_list_size;
int retval;
- char *packet_p;
+ char const *packet_p;
#ifdef _DEBUG_GDB_IO_
LOG_DEBUG("-");
}
static int gdb_get_register_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *reg_packet;
}
static int gdb_set_register_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *separator;
* 8191 bytes by the looks of it. Why 8191 bytes instead of 8192?????
*/
static int gdb_read_memory_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *separator;
}
static int gdb_write_memory_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *separator;
}
static int gdb_write_memory_binary_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *separator;
}
static int gdb_step_continue_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
int current = 0;
LOG_DEBUG("-");
- if (packet_size > 1) {
- packet[packet_size] = 0;
+ if (packet_size > 1)
address = strtoul(packet + 1, NULL, 16);
- } else
+ else
current = 1;
gdb_running_type = packet[0];
}
static int gdb_breakpoint_watchpoint_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
int type;
}
}
-static int decode_xfer_read(char *buf, char **annex, int *ofs, unsigned int *len)
+static int decode_xfer_read(char const *_buf, char **annex, int *ofs, unsigned int *len)
{
+ int ret = 0;
+ char *buf = strdup(_buf);
+ char *_annex;
char *separator;
/* Extract and NUL-terminate the annex. */
- *annex = buf;
+ _annex = buf;
while (*buf && *buf != ':')
buf++;
- if (*buf == '\0')
- return -1;
+ if (*buf == '\0') {
+ ret = -1;
+ goto out;
+ }
*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
* traditional 'm' packet. */
*ofs = strtoul(buf, &separator, 16);
- if (*separator != ',')
- return -1;
+ if (*separator != ',') {
+ ret = -1;
+ goto out;
+ }
*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 gdb_memory_map(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
/* We get away with only specifying flash here. Regions that are not
* specified are treated as if we provided no memory map(if not we
static int gdb_generate_target_description(struct target *target, char **tdesc_out)
{
int retval = ERROR_OK;
- struct reg **reg_list;
+ struct reg **reg_list = NULL;
int reg_list_size;
+ char **features = NULL;
+ int feature_list_size = 0;
char *tdesc = NULL;
int pos = 0;
int size = 0;
if (retval != ERROR_OK) {
LOG_ERROR("get register list failed");
- return ERROR_FAIL;
+ retval = ERROR_FAIL;
+ goto error;
}
if (reg_list_size <= 0) {
- free(reg_list);
- return ERROR_FAIL;
+ LOG_ERROR("get register list failed");
+ retval = ERROR_FAIL;
+ goto error;
}
- char **features = NULL;
/* Get a list of available target registers features */
- retval = get_reg_features_list(target, &features, NULL, reg_list, reg_list_size);
+ retval = get_reg_features_list(target, &features, &feature_list_size, reg_list, reg_list_size);
if (retval != ERROR_OK) {
LOG_ERROR("Can't get the registers feature list");
- free(reg_list);
- return ERROR_FAIL;
+ retval = ERROR_FAIL;
+ goto error;
}
/* If we found some features associated with registers, create sections */
xml_printf(&retval, &tdesc, &pos, &size,
"</target>\n");
- free(reg_list);
+error:
+
+ /* note: features[] contains (feature_list_size + 1) elements */
+ for (int j = feature_list_size; j >= 0; j--)
+ free(features[j]);
free(features);
+ free(reg_list);
if (retval == ERROR_OK)
*tdesc_out = tdesc;
int retval = ERROR_OK;
struct reg **reg_list = NULL;
int reg_list_size = 0;
- int feature_list_size = 0;
char **features = NULL;
+ int feature_list_size = 0;
retval = target_get_gdb_reg_list(target, ®_list,
®_list_size, REG_CLASS_ALL);
}
if (reg_list_size <= 0) {
+ LOG_ERROR("get register list failed");
retval = ERROR_FAIL;
goto error;
}
}
error:
- if (reg_list != NULL)
- free(reg_list);
- if (features != NULL)
- free(features);
+ /* note: features[] contains (feature_list_size + 1) elements */
+ for (int j = feature_list_size; j >= 0; j--)
+ free(features[j]);
+ free(features);
+
+ free(reg_list);
return retval;
}
static int gdb_query_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct command_context *cmd_ctx = connection->cmd_ctx;
struct gdb_connection *gdb_connection = connection->priv;
int offset;
unsigned int length;
- char *annex;
+ char *annex = NULL;
/* skip command character */
packet += 20;
gdb_send_error(connection, 01);
return ERROR_OK;
}
+ free(annex);
/* Target should prepare correct target description for annex.
* The first character of returned xml is 'm' or 'l'. 'm' for
}
static int gdb_v_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct gdb_connection *gdb_connection = connection->priv;
struct gdb_service *gdb_service = connection->service->priv;
unsigned long addr;
unsigned long length;
- char *parse = packet + 12;
+ char const *parse = packet + 12;
if (*parse == '\0') {
LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
return ERROR_SERVER_REMOTE_CLOSED;
}
- addr = strtoul(parse, &parse, 16);
+ addr = strtoul(parse, (char **)&parse, 16);
if (*(parse++) != ',' || *parse == '\0') {
LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
return ERROR_SERVER_REMOTE_CLOSED;
}
- length = strtoul(parse, &parse, 16);
+ length = strtoul(parse, (char **)&parse, 16);
if (*parse != '\0') {
LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
int retval;
unsigned long addr;
unsigned long length;
- char *parse = packet + 12;
+ char const *parse = packet + 12;
if (*parse == '\0') {
LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
return ERROR_SERVER_REMOTE_CLOSED;
}
- addr = strtoul(parse, &parse, 16);
+ addr = strtoul(parse, (char **)&parse, 16);
if (*(parse++) != ':') {
LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
return ERROR_SERVER_REMOTE_CLOSED;
/* create new section with content from packet buffer */
retval = image_add_section(gdb_connection->vflash_image,
- addr, length, 0x0, (uint8_t *)parse);
+ addr, length, 0x0, (uint8_t const *)parse);
if (retval != ERROR_OK)
return retval;
* Fretcode,errno,Ctrl-C flag;call-specific attachment
*/
static int gdb_fileio_response_packet(struct connection *connection,
- char *packet, int packet_size)
+ char const *packet, int packet_size)
{
struct target *target = get_target_from_connection(connection);
char *separator;
struct gdb_service *gdb_service = connection->service->priv;
struct target *target = gdb_service->target;
- char *packet = gdb_packet_buffer;
+ char const *packet = gdb_packet_buffer;
int packet_size;
int retval;
struct gdb_connection *gdb_con = connection->priv;
*/
do {
packet_size = GDB_BUFFER_SIZE-1;
- retval = gdb_get_packet(connection, packet, &packet_size);
+ retval = gdb_get_packet(connection, gdb_packet_buffer, &packet_size);
if (retval != ERROR_OK)
return retval;
/* terminate with zero */
- packet[packet_size] = 0;
+ gdb_packet_buffer[packet_size] = '\0';
if (LOG_LEVEL_IS(LOG_LVL_DEBUG)) {
if (packet[0] == 'X') {