server/telnet: fix autocomplete for jimtcl commands
Current autocomplete filters-out some command reported by "info commands". One of the filter rule concerns the command's private data. Every command registered by OpenOCD has its 'struct command' as private data. By ignoring commands without private data, we loose several TCL commands registered by jimtcl, e.g. 'foreach', 'llength'. By assuming that every command with non-NULL private data has 'struct command' as private data, we risk at best to access inconsistent data, at worst to trigger a segmentation fault. Export the already available functions: - to check if a command has been registered by OpenOCD and - to get the private data. While there, rename jimcmd_is_ocd_command() as jimcmd_is_oocd_command(). Don't filter-out jimtcl commands with no private data. Check the private data only on OpenOCD commands. Change-Id: Ib5bf8d2bc5c12440c0cfae438f637c38724a79b7 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/6282 Tested-by: jenkins Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
This commit is contained in:
@@ -62,12 +62,12 @@ static inline bool jimcmd_is_proc(Jim_Cmd *cmd)
|
||||
return cmd->isproc;
|
||||
}
|
||||
|
||||
static inline bool jimcmd_is_ocd_command(Jim_Cmd *cmd)
|
||||
bool jimcmd_is_oocd_command(Jim_Cmd *cmd)
|
||||
{
|
||||
return !cmd->isproc && cmd->u.native.cmdProc == jim_command_dispatch;
|
||||
}
|
||||
|
||||
static inline void *jimcmd_privdata(Jim_Cmd *cmd)
|
||||
void *jimcmd_privdata(Jim_Cmd *cmd)
|
||||
{
|
||||
return cmd->isproc ? NULL : cmd->u.native.privData;
|
||||
}
|
||||
@@ -261,7 +261,7 @@ static struct command *command_find_from_name(Jim_Interp *interp, const char *na
|
||||
Jim_IncrRefCount(jim_name);
|
||||
Jim_Cmd *cmd = Jim_GetCommand(interp, jim_name, JIM_NONE);
|
||||
Jim_DecrRefCount(interp, jim_name);
|
||||
if (!cmd || jimcmd_is_proc(cmd) || !jimcmd_is_ocd_command(cmd))
|
||||
if (!cmd || jimcmd_is_proc(cmd) || !jimcmd_is_oocd_command(cmd))
|
||||
return NULL;
|
||||
|
||||
return jimcmd_privdata(cmd);
|
||||
@@ -1020,7 +1020,7 @@ static int jim_command_mode(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
||||
Jim_Cmd *cmd = Jim_GetCommand(interp, s, JIM_NONE);
|
||||
Jim_DecrRefCount(interp, s);
|
||||
free(full_name);
|
||||
if (!cmd || !(jimcmd_is_proc(cmd) || jimcmd_is_ocd_command(cmd))) {
|
||||
if (!cmd || !(jimcmd_is_proc(cmd) || jimcmd_is_oocd_command(cmd))) {
|
||||
Jim_SetResultString(interp, "unknown", -1);
|
||||
return JIM_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user