vi: deal with invalid movements in shift commands

Since commit 25d259264 (vi: make buffer handling more vi-like)
find_range() can return early when an invalid movement is
specified.

The call to find_range() in the code that handles shift commands
('<' and '>') doesn't check for this condition.  Previously this
only resulted in the current line being shifted but it can now
result in a segfault.

Check for an invalid movement and notify the user without taking
any further action.

function                                             old     new   delta
do_cmd                                              4890    4898      +8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 8/0)                 Total: 8 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-03-30 13:02:32 +01:00 committed by Denys Vlasenko
parent a25b4c2c42
commit 24198f652f

View File

@ -7,7 +7,6 @@
*/ */
// //
//Things To Do: //Things To Do:
// EXINIT
// $HOME/.exrc and ./.exrc // $HOME/.exrc and ./.exrc
// add magic to search /foo.*bar // add magic to search /foo.*bar
// add :help command // add :help command
@ -3574,7 +3573,10 @@ static void do_cmd(int c)
case '>': // >- Right shift something case '>': // >- Right shift something
cnt = count_lines(text, dot); // remember what line we are on cnt = count_lines(text, dot); // remember what line we are on
c1 = get_motion_char(); // get the type of thing to operate on c1 = get_motion_char(); // get the type of thing to operate on
find_range(&p, &q, c1); if (find_range(&p, &q, c1) == -1) {
indicate_error();
goto dc6;
}
yank_delete(p, q, WHOLE, YANKONLY, NO_UNDO); // save copy before change yank_delete(p, q, WHOLE, YANKONLY, NO_UNDO); // save copy before change
p = begin_line(p); p = begin_line(p);
q = end_line(q); q = end_line(q);