From 5022c6ce34b5215e63a4ea5972ca0ed0fd196ab0 Mon Sep 17 00:00:00 2001 From: Chris Luke Date: Fri, 17 May 2019 10:17:16 -0400 Subject: [PATCH] Fix 'terminal history off' crasher - 'set terminal history off' or '... limit 0' has an incorrect terminal condition and tries to vec_delete one-too-many times causing a crash. - Changing >= to > fixes this. - In any case, a single vec_delete is more efficient, so do that instead. Change-Id: Ia0db63b6c5c7891d75b302e793b4e4985dd86ebb Signed-off-by: Chris Luke --- src/vlib/unix/cli.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/vlib/unix/cli.c b/src/vlib/unix/cli.c index f9d6b40c4d5..2d5a22dc66a 100644 --- a/src/vlib/unix/cli.c +++ b/src/vlib/unix/cli.c @@ -3603,14 +3603,21 @@ unix_cli_set_terminal_history (vlib_main_t * vm, goto done; } - /* If we reduced history size, or turned it off, purge the history */ - limit = cf->has_history ? cf->history_limit : 0; + } - while (cf->command_history && vec_len (cf->command_history) >= limit) - { - vec_free (cf->command_history[0]); - vec_delete (cf->command_history, 1, 0); - } + /* If we reduced history size, or turned it off, purge the history */ + limit = cf->has_history ? cf->history_limit : 0; + if (limit < vec_len (cf->command_history)) + { + u32 i; + + /* How many items to remove from the start of history */ + limit = vec_len (cf->command_history) - limit; + + for (i = 0; i < limit; i++) + vec_free (cf->command_history[i]); + + vec_delete (cf->command_history, limit, 0); } done: -- 2.16.6