Looks good, ok nicm
On Tue, Feb 26, 2019 at 02:39:14AM +0100, Ingo Schwarze wrote: > Hi Todd, > > Todd C. Miller wrote on Mon, Feb 25, 2019 at 01:06:02PM -0700: > > On Mon, 25 Feb 2019 19:43:36 +0100, Ingo Schwarze wrote: > >> Todd C. Miller wrote on Mon, Feb 25, 2019 at 09:45:12AM -0700: > >>> On Mon, 25 Feb 2019 12:39:41 +0100, Ingo Schwarze wrote: > > >>>> Index: line.c > >> [...] > >>>> @@ -469,11 +469,10 @@ in_ansi_esc_seq(void) > >>>> * Search backwards for either an ESC (which means we ARE in a > >>>> seq); > >>>> * or an end char (which means we're NOT in a seq). > >>>> */ > >>>> - for (p = &linebuf[curr]; p > linebuf; ) { > >>>> - LWCHAR ch = step_char(&p, -1, linebuf); > >>>> - if (IS_CSI_START(ch)) > >>>> + for (p = linebuf + curr - 1; p >= linebuf; p--) { > > >>> Since curr can be 0, can this lead to be a single byte underflow? > > >> No, in that case (which logically means the line buffer is empty), > >> the end condition p >= linebuf is false right away, the loop > >> is never entered, the function returns 0 right away and at the > >> call site, the first if brach (containing "curr--") isn't entered > >> either. > > > Strictly speaking, the result of "p = linebuf + curr - 1" is undefined > > when curr < 1. There is a special case in the standard when the > > result is one past the end of an array but no corresponding case > > for one element before the array. In practice, it is unlikely to > > matter. > > Ouch, i keep forgetting that one, thanks for reminding me. > > In that case, let's just use an index rather than a pointer; > diff otherwise unchanged. > > OK? > Ingo > > > Index: cvt.c > =================================================================== > RCS file: /cvs/src/usr.bin/less/cvt.c,v > retrieving revision 1.8 > diff -u -p -r1.8 cvt.c > --- cvt.c 17 Sep 2016 15:06:41 -0000 1.8 > +++ cvt.c 26 Feb 2019 01:31:31 -0000 > @@ -77,7 +77,7 @@ cvt_text(char *odst, char *osrc, int *ch > dst--; > } while (dst > odst && > !IS_ASCII_OCTET(*dst) && !IS_UTF8_LEAD(*dst)); > - } else if ((ops & CVT_ANSI) && IS_CSI_START(ch)) { > + } else if ((ops & CVT_ANSI) && ch == ESC) { > /* Skip to end of ANSI escape sequence. */ > src++; /* skip the CSI start char */ > while (src < src_end) > Index: filename.c > =================================================================== > RCS file: /cvs/src/usr.bin/less/filename.c,v > retrieving revision 1.26 > diff -u -p -r1.26 filename.c > --- filename.c 29 Oct 2017 17:10:55 -0000 1.26 > +++ filename.c 26 Feb 2019 01:31:31 -0000 > @@ -348,7 +348,7 @@ bin_file(int f) > pend = &data[n]; > for (p = data; p < pend; ) { > LWCHAR c = step_char(&p, +1, pend); > - if (ctldisp == OPT_ONPLUS && IS_CSI_START(c)) { > + if (ctldisp == OPT_ONPLUS && c == ESC) { > do { > c = step_char(&p, +1, pend); > } while (p < pend && is_ansi_middle(c)); > Index: less.h > =================================================================== > RCS file: /cvs/src/usr.bin/less/less.h,v > retrieving revision 1.28 > diff -u -p -r1.28 less.h > --- less.h 30 Dec 2018 23:09:58 -0000 1.28 > +++ less.h 26 Feb 2019 01:31:31 -0000 > @@ -38,8 +38,6 @@ > #define IS_SPACE(c) isspace((unsigned char)(c)) > #define IS_DIGIT(c) isdigit((unsigned char)(c)) > > -#define IS_CSI_START(c) (((LWCHAR)(c)) == ESC || (((LWCHAR)(c)) == CSI)) > - > #ifndef TRUE > #define TRUE 1 > #endif > @@ -151,9 +149,7 @@ struct textlist { > #define AT_INDET (1 << 7) /* Indeterminate: either bold or > underline */ > > #define CONTROL(c) ((c)&037) > - > #define ESC CONTROL('[') > -#define CSI ((unsigned char)'\233') > > #define S_INTERRUPT 01 > #define S_STOP 02 > Index: line.c > =================================================================== > RCS file: /cvs/src/usr.bin/less/line.c,v > retrieving revision 1.23 > diff -u -p -r1.23 line.c > --- line.c 24 Feb 2019 04:54:36 -0000 1.23 > +++ line.c 26 Feb 2019 01:31:31 -0000 > @@ -230,7 +230,7 @@ pshift(int shift) > */ > while (shifted <= shift && from < curr) { > c = linebuf[from]; > - if (ctldisp == OPT_ONPLUS && IS_CSI_START(c)) { > + if (ctldisp == OPT_ONPLUS && c == ESC) { > /* Keep cumulative effect. */ > linebuf[to] = c; > attr[to++] = attr[from++]; > @@ -463,17 +463,16 @@ backc(void) > static int > in_ansi_esc_seq(void) > { > - char *p; > + int i; > > /* > * Search backwards for either an ESC (which means we ARE in a seq); > * or an end char (which means we're NOT in a seq). > */ > - for (p = &linebuf[curr]; p > linebuf; ) { > - LWCHAR ch = step_char(&p, -1, linebuf); > - if (IS_CSI_START(ch)) > + for (i = curr - 1; i >= 0; i--) { > + if (linebuf[i] == ESC) > return (1); > - if (!is_ansi_middle(ch)) > + if (!is_ansi_middle(linebuf[i])) > return (0); > } > return (0); > @@ -533,17 +532,14 @@ store_char(LWCHAR ch, char a, char *rep, > if (ctldisp == OPT_ONPLUS && in_ansi_esc_seq()) { > if (!is_ansi_end(ch) && !is_ansi_middle(ch)) { > /* Remove whole unrecognized sequence. */ > - char *p = &linebuf[curr]; > - LWCHAR bch; > do { > - bch = step_char(&p, -1, linebuf); > - } while (p > linebuf && !IS_CSI_START(bch)); > - curr = p - linebuf; > + curr--; > + } while (curr > 0 && linebuf[curr] != ESC); > return (0); > } > a = AT_ANSI; /* Will force re-AT_'ing around it. */ > w = 0; > - } else if (ctldisp == OPT_ONPLUS && IS_CSI_START(ch)) { > + } else if (ctldisp == OPT_ONPLUS && ch == ESC) { > a = AT_ANSI; /* Will force re-AT_'ing around it. */ > w = 0; > } else { > @@ -851,7 +847,7 @@ do_append(LWCHAR ch, char *rep, off_t po > } else if ((!utf_mode || is_ascii_char(ch)) && control_char((char)ch)) { > do_control_char: > if (ctldisp == OPT_ON || > - (ctldisp == OPT_ONPLUS && IS_CSI_START(ch))) { > + (ctldisp == OPT_ONPLUS && ch == ESC)) { > /* > * Output as a normal character. > */