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");
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 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)
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