This is an automated email from Gerrit.

"Antonio Borneo <borneo.anto...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6966

-- gerrit

commit 3fe14f1718e8a74214e4f43a1e9eb0ba4148cd90
Author: Antonio Borneo <borneo.anto...@gmail.com>
Date:   Wed May 4 16:17:08 2022 +0200

    server/gdb: fix gdb remote monitor cmd on multi-target
    
    Commit 5ebb1bdea1df ("server/gdb: fix return of gdb remote monitor
    command") replaces the call to command_run_line() with call to
    Jim_EvalObj() but does not properly set the "context".
    In multi-target environment, his can cause the erroneously
    execution of the command on the wrong target.
    
    Copy from the code in command_run_line() the proper setup before
    executing Jim_EvalObj().
    
    Change-Id: I56738c80779082ca146a06c01bc30e28bc835fd3
    Signed-off-by: Antonio Borneo <borneo.anto...@gmail.com>
    Reported-by: Bohdan Tymkiv <bohdan...@gmail.com>
    Fixes: 5ebb1bdea1df ("server/gdb: fix return of gdb remote monitor command")

diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index fcc87fba1c..2c5cdacb81 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -2750,6 +2750,7 @@ static int gdb_query_packet(struct connection *connection,
 
        if (strncmp(packet, "qRcmd,", 6) == 0) {
                if (packet_size > 6) {
+                       Jim_Interp *interp = cmd_ctx->interp;
                        char *cmd;
                        cmd = malloc((packet_size - 6) / 2 + 1);
                        size_t len = unhexify((uint8_t *)cmd, packet + 6, 
(packet_size - 6) / 2);
@@ -2761,20 +2762,31 @@ static int gdb_query_packet(struct connection 
*connection,
                        /* some commands need to know the GDB connection, make 
note of current
                         * GDB connection. */
                        current_gdb_connection = gdb_connection;
+
                        struct target *saved_target_override = 
cmd_ctx->current_target_override;
-                       cmd_ctx->current_target_override = target;
+                       cmd_ctx->current_target_override = NULL;
 
-                       int retval = Jim_EvalObj(cmd_ctx->interp, 
Jim_NewStringObj(cmd_ctx->interp, cmd, -1));
+                       struct command_context *old_context = 
Jim_GetAssocData(interp, "context");
+                       Jim_DeleteAssocData(interp, "context");
+                       int retval = Jim_SetAssocData(interp, "context", NULL, 
cmd_ctx);
+                       if (retval == JIM_OK) {
+                               retval = Jim_EvalObj(interp, 
Jim_NewStringObj(interp, cmd, -1));
+                               Jim_DeleteAssocData(interp, "context");
+                       }
+                       int inner_retval = Jim_SetAssocData(interp, "context", 
NULL, old_context);
+                       if (retval == JIM_OK)
+                               retval = inner_retval;
 
                        cmd_ctx->current_target_override = 
saved_target_override;
+
                        current_gdb_connection = NULL;
                        target_call_timer_callbacks_now();
                        gdb_connection->output_flag = GDB_OUTPUT_NO;
                        free(cmd);
                        if (retval == JIM_RETURN)
-                               retval = cmd_ctx->interp->returnCode;
+                               retval = interp->returnCode;
                        int lenmsg;
-                       const char *cretmsg = 
Jim_GetString(Jim_GetResult(cmd_ctx->interp), &lenmsg);
+                       const char *cretmsg = 
Jim_GetString(Jim_GetResult(interp), &lenmsg);
                        char *retmsg;
                        if (lenmsg && cretmsg[lenmsg - 1] != '\n') {
                                retmsg = alloc_printf("%s\n", cretmsg);

-- 

Reply via email to