aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2024-02-25 18:36:47 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2024-03-09 11:04:29 +0000
commitfcda9f1561bfc413e3723e5b4552bc7e91eb4a8d (patch)
treeae2e5e55cca96b1ccfdf1c9a56e6e0272fc29cf2 /src
parent5c395fdef42a5750852ea0fc0abd944cf303a39b (diff)
downloadriscv-openocd-fcda9f1561bfc413e3723e5b4552bc7e91eb4a8d.zip
riscv-openocd-fcda9f1561bfc413e3723e5b4552bc7e91eb4a8d.tar.gz
riscv-openocd-fcda9f1561bfc413e3723e5b4552bc7e91eb4a8d.tar.bz2
gdb_server: fix segfault with GDB command 'flash-erase'
Running the GDB command 'flash-erase' triggers sending the remote GDB commands 'vFlashErase' (one per flash bank) followed by one single 'vFlashDone', with no 'vFlashWrite' commands in between. This causes the field 'gdb_connection->vflash_image' to be NULL during the execution of 'vFlashDone', triggering a segmentation fault in OpenOCD. While parsing 'vFlashDone', check if any image to flash has been received. Change-Id: I443021c7a531255b60f2c44c2685e52e3c34b5c8 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/8164 Tested-by: jenkins
Diffstat (limited to 'src')
-rw-r--r--src/server/gdb_server.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index b140689..ae288de 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -3376,6 +3376,13 @@ static int gdb_v_packet(struct connection *connection,
if (strncmp(packet, "vFlashDone", 10) == 0) {
uint32_t written;
+ /* GDB command 'flash-erase' does not send a vFlashWrite,
+ * so nothing to write here. */
+ if (!gdb_connection->vflash_image) {
+ gdb_put_packet(connection, "OK", 2);
+ return ERROR_OK;
+ }
+
/* process the flashing buffer. No need to erase as GDB
* always issues a vFlashErase first. */
target_call_event_callbacks(target,