This is an automated email from Gerrit.

Christopher Head ([email protected]) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/4730

-- gerrit

commit aea23fe9da7ee31d191091708ea963b613d9092f
Author: Christopher Head <[email protected]>
Date:   Thu Oct 18 14:20:45 2018 -0700

    Permit null target on TCL connection
    
    In previous versions of OpenOCD, it was possible to connect to the TCL
    RCP interface without a current target. In `tcl_new_connection`, the
    curent target would be queried by number, and the possibility of a null
    current target was handled properly.
    
    In commit bb9d9c60264a905926e0d15f84842858d0de80b7, the
    `get_target_by_num` call was replaced by a `get_current_target` call,
    without noticing that `get_current_target` aborts if there is no current
    target, whereas `tcl_new_connection` is perfectly able to handle that
    situation.
    
    Provide a `get_current_target_or_null` function for use by consumers who
    are OK with a null current target, and use it in `tcl_new_connection`.
    
    Change-Id: I06f7e1e149f1169e23c73ba328c7ad9f9425cc2a
    Signed-off-by: Christopher Head <[email protected]>

diff --git a/src/server/tcl_server.c b/src/server/tcl_server.c
index 3cb63a2..0676c88 100644
--- a/src/server/tcl_server.c
+++ b/src/server/tcl_server.c
@@ -157,7 +157,7 @@ static int tcl_new_connection(struct connection *connection)
 
        connection->priv = tclc;
 
-       struct target *target = get_current_target(connection->cmd_ctx);
+       struct target *target = get_current_target_or_null(connection->cmd_ctx);
        if (target != NULL)
                tclc->tc_laststate = target->state;
 
diff --git a/src/target/target.c b/src/target/target.c
index bf36691..14c7ea4 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -517,9 +517,7 @@ struct target *get_target_by_num(int num)
 
 struct target *get_current_target(struct command_context *cmd_ctx)
 {
-       struct target *target = cmd_ctx->current_target_override
-               ? cmd_ctx->current_target_override
-               : cmd_ctx->current_target;
+       struct target *target = get_current_target_or_null(cmd_ctx);
 
        if (target == NULL) {
                LOG_ERROR("BUG: current_target out of bounds");
@@ -529,6 +527,13 @@ struct target *get_current_target(struct command_context 
*cmd_ctx)
        return target;
 }
 
+struct target *get_current_target_or_null(struct command_context *cmd_ctx)
+{
+       return cmd_ctx->current_target_override
+               ? cmd_ctx->current_target_override
+               : cmd_ctx->current_target;
+}
+
 int target_poll(struct target *target)
 {
        int retval;
diff --git a/src/target/target.h b/src/target/target.h
index d796131..fb9d714 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -396,6 +396,7 @@ int target_call_timer_callbacks_now(void);
 
 struct target *get_target_by_num(int num);
 struct target *get_current_target(struct command_context *cmd_ctx);
+struct target *get_current_target_or_null(struct command_context *cmd_ctx);
 struct target *get_target(const char *id);
 
 /**

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to