diff --git a/NEWS b/NEWS index 79afb8211d4c..7daba1bc9d47 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh Any uppercase BUG_* names are modernish shell bug IDs. +2021-03-29: + +- Fixed an intermittent crash that could occur in vi mode when using the 'b' + or 'B' commands to go back one word. + 2021-03-27: - The 'test' builtin will now show an error message when given the invalid ']]' diff --git a/src/cmd/ksh93/edit/vi.c b/src/cmd/ksh93/edit/vi.c index 8196ffca047c..59f0ab16a2cc 100644 --- a/src/cmd/ksh93/edit/vi.c +++ b/src/cmd/ksh93/edit/vi.c @@ -664,8 +664,7 @@ static void backword(Vi_t *vp,int nwords, register int cmd) register int tcur_virt = cur_virt; while( nwords-- && tcur_virt > first_virt ) { - if( !isblank(tcur_virt) && isblank(tcur_virt-1) - && tcur_virt>first_virt ) + if( !isblank(tcur_virt) && isblank(tcur_virt-1) ) --tcur_virt; else if(cmd != 'B') { @@ -674,21 +673,20 @@ static void backword(Vi_t *vp,int nwords, register int cmd) if((!cur && last) || (cur && !last)) --tcur_virt; } - while( isblank(tcur_virt) && tcur_virt>=first_virt ) + while( tcur_virt >= first_virt && isblank(tcur_virt) ) --tcur_virt; if( cmd == 'B' ) { - while( !isblank(tcur_virt) && tcur_virt>=first_virt ) + while( tcur_virt >= first_virt && !isblank(tcur_virt) ) --tcur_virt; } else { if(isalph(tcur_virt)) - while( isalph(tcur_virt) && tcur_virt>=first_virt ) + while( tcur_virt >= first_virt && isalph(tcur_virt) ) --tcur_virt; else - while( !isalph(tcur_virt) && !isblank(tcur_virt) - && tcur_virt>=first_virt ) + while( tcur_virt >= first_virt && !isalph(tcur_virt) && !isblank(tcur_virt) ) --tcur_virt; } cur_virt = ++tcur_virt; @@ -1235,23 +1233,22 @@ static void endword(Vi_t *vp, int nwords, register int cmd) register int tcur_virt = cur_virt; while( nwords-- ) { - if( !isblank(tcur_virt) && tcur_virt<=last_virt ) + if( tcur_virt <= last_virt && !isblank(tcur_virt) ) ++tcur_virt; - while( isblank(tcur_virt) && tcur_virt<=last_virt ) + while( tcur_virt <= last_virt && isblank(tcur_virt) ) ++tcur_virt; if( cmd == 'E' ) { - while( !isblank(tcur_virt) && tcur_virt<=last_virt ) + while( tcur_virt <= last_virt && !isblank(tcur_virt) ) ++tcur_virt; } else { if( isalph(tcur_virt) ) - while( isalph(tcur_virt) && tcur_virt<=last_virt ) + while( tcur_virt <= last_virt && isalph(tcur_virt) ) ++tcur_virt; else - while( !isalph(tcur_virt) && !isblank(tcur_virt) - && tcur_virt<=last_virt ) + while( tcur_virt <= last_virt && !isalph(tcur_virt) && !isblank(tcur_virt) ) ++tcur_virt; } if( tcur_virt > first_virt ) @@ -1274,24 +1271,23 @@ static void forward(Vi_t *vp,register int nwords, int cmd) { if( cmd == 'W' ) { - while( !isblank(tcur_virt) && tcur_virt < last_virt ) + while( tcur_virt < last_virt && !isblank(tcur_virt) ) ++tcur_virt; } else { if( isalph(tcur_virt) ) { - while( isalph(tcur_virt) && tcur_virt