In bash-4.1 patchlevel 5 (probably all older versions) crashes.
Reproducer:
1. set -o vi #set ups vi command line editing
2. type the following command as seen, but do not hit enter at last one
for i in `ls`
do
echo $i
done
3.After typeing done (but not enter), hit escape
4.type the letter v to open a vi editor to edit command above (for i ...)
Following patch do 2 thing.
1) check if hlist[i] isn't NULL
2) Don't invoke vi editing if command is multilined
ad 2) I didn't find any specification what should shell do with
multiline command. But editing multiline can make troubles. Anyway:
Should be editing multilined command allowed? If so, should it edit all
lines or only current line?
ad 1) It's just poor check and can return NULL. Maybe it can be checked
elsewhere. And problem is in counting the end of history. In file
builtins/fc.def on line 304 you are subtracting `hist_last_line_added'.
`hist_last_line_added' is 0 but the last is added - in
edit_and_execute_command function. Maybe setting `hist_last_line_added'
to 1 in that function can somehow help.
Patch:
diff -up bash-4.1/bashline.c.check bash-4.1/bashline.c
--- bash-4.1/bashline.c.check 2010-04-14 14:05:06.000000000 +0200
+++ bash-4.1/bashline.c 2010-04-14 14:07:07.000000000 +0200
@@ -867,6 +867,12 @@ edit_and_execute_command (count, c, edit
rrs = rl_readline_state;
cclc = current_command_line_count;
+ if (cclc > 0)
+ {
+ /* Don't edit multiline command*/
+ return 1;
+ }
+
/* Accept the current line. */
rl_newline (1, c);
diff -up bash-4.1/builtins/fc.def.check bash-4.1/builtins/fc.def
--- bash-4.1/builtins/fc.def.check 2010-04-14 13:20:28.000000000 +0200
+++ bash-4.1/builtins/fc.def 2010-04-14 13:22:08.000000000 +0200
@@ -131,8 +131,8 @@ typedef struct repl {
} REPL;
/* Accessors for HIST_ENTRY lists that are called HLIST. */
-#define histline(i) (hlist[(i)]->line)
-#define histdata(i) (hlist[(i)]->data)
+#define histline(i) (hlist[(i)] ? hlist[(i)]->line : NULL)
+#define histdata(i) (hlist[(i)] ? hlist[(i)]->data : NULL)
#define FREE_RLIST() \
do { \
RR