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.
>                        */

Reply via email to