summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston2019-04-28 09:09:33 +0100
committerDenys Vlasenko2019-04-28 17:16:46 +0200
commit4b49422a08b89bd01023e7b4fa73ab058ee66932 (patch)
treefd1d428164b22ab22b2f03cf2307cef9fbd15931
parent93f0b39a0712f3247349f1590757484ca18e725e (diff)
downloadbusybox-4b49422a08b89bd01023e7b4fa73ab058ee66932.zip
busybox-4b49422a08b89bd01023e7b4fa73ab058ee66932.tar.gz
vi: fix changes to word at end of line. Closes 11796
As reported in bug 11796 BusyBox vi incorrectly handles changes to a word at the end of a line. If the following line starts with whitespace changing or deleting the last word of a line with the 'cw' or 'dw' commands causes the lines to be joined. This happens because the range for the change returned by find_range() covers all whitespace after the word, including newlines. The problem can be fixed by setting 'ml' to zero to indicate to yank_delete() that processing should stop at the end of the current line. However, this results in a new problem. 'dw' correctly deletes all whitespace following the word but so does 'cw', which should preserve the trailing whitespace. To fix this the code to omit whitespace from the change is modified to include all whitespace not just blanks. function old new delta do_cmd 5034 5069 +35 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 35/0) Total: 35 bytes Reported-by: David Kelly <david.kelly@liberica.ch> Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/vi.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/editors/vi.c b/editors/vi.c
index c4360f8..dfef420 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -3770,11 +3770,10 @@ static void do_cmd(int c)
if (c1 == 27) { // ESC- user changed mind and wants out
c = c1 = 27; // Escape- do nothing
} else if (strchr("wW", c1)) {
+ ml = 0; // multi-line ranges aren't allowed for words
if (c == 'c') {
// don't include trailing WS as part of word
- while (isblank(*q)) {
- if (q <= text || q[-1] == '\n')
- break;
+ while (isspace(*q) && q > p) {
q--;
}
}