X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fserver%2Fgdb_server.c;h=0b28287d80a7c8ee22f69a7f18d72ad3e69f0162;hp=ea82114081dd1d6bd3f714fab77966bcd6d9712a;hb=537b06a810778995d7f79d9120f4063f33dee635;hpb=3e0f34b198b1654f89fc96d04d4cfcb7b889c702 diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index ea82114081..0b28287d80 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -617,11 +617,21 @@ static int gdb_get_packet_inner(struct connection *connection, case '$': break; case '+': - /* gdb sends a dummy ack '+' at every remote connect - see - * remote_start_remote (remote.c) - * in case anyone tries to debug why they receive this - * warning every time */ - LOG_WARNING("acknowledgment received, but no packet pending"); + /* According to the GDB documentation + * (https://sourceware.org/gdb/onlinedocs/gdb/Packet-Acknowledgment.html): + * "gdb sends a final `+` acknowledgment of the stub's `OK` + * response, which can be safely ignored by the stub." + * However OpenOCD server already is in noack mode at this + * point and instead of ignoring this it was emitting a + * warning. This code makes server ignore the first ACK + * that will be received after going into noack mode, + * warning only about subsequent ACK's. */ + if (gdb_con->noack_mode > 1) { + LOG_WARNING("acknowledgment received, but no packet pending"); + } else { + LOG_DEBUG("Received first acknowledgment after entering noack mode. Ignoring it."); + gdb_con->noack_mode = 2; + } break; case '-': LOG_WARNING("negative acknowledgment, but no packet pending"); @@ -1512,10 +1522,9 @@ static int gdb_step_continue_packet(struct connection *connection, 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]; @@ -1660,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; /* 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) @@ -2355,7 +2376,7 @@ static int gdb_query_packet(struct connection *connection, int offset; unsigned int length; - char *annex; + char *annex = NULL; /* skip command character */ packet += 20; @@ -2364,6 +2385,7 @@ static int gdb_query_packet(struct connection *connection, 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