diff options
author | Christopher Head <chead@zaber.com> | 2018-10-18 14:20:45 -0700 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2018-11-13 07:02:58 +0000 |
commit | ea41048830f3ef79129fdbf3623d708585929f5b (patch) | |
tree | 8a9ee38a7a190a32a79ae2ca21da407cb5289618 /src | |
parent | 8d914e4d97df45b72fbb6919af1d276f3f69c6f3 (diff) | |
download | riscv-openocd-ea41048830f3ef79129fdbf3623d708585929f5b.zip riscv-openocd-ea41048830f3ef79129fdbf3623d708585929f5b.tar.gz riscv-openocd-ea41048830f3ef79129fdbf3623d708585929f5b.tar.bz2 |
Permit null target on TCL connection
In previous versions of OpenOCD, it was possible to connect to the TCL
RPC 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 <chead@zaber.com>
Reviewed-on: http://openocd.zylin.com/4730
Tested-by: jenkins
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-by: Franck Jullien <franck.jullien@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/tcl_server.c | 2 | ||||
-rw-r--r-- | src/target/target.c | 11 | ||||
-rw-r--r-- | src/target/target.h | 1 |
3 files changed, 10 insertions, 4 deletions
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 8715883..74b332d 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); /** |