nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Nano-devel] [PATCH 8/8] justification: limit the amount of recursio


From: Eitan Adler
Subject: Re: [Nano-devel] [PATCH 8/8] justification: limit the amount of recursion to prevent a stack overflow
Date: Sat, 26 May 2018 20:20:11 -0700

LGTM

On 26 May 2018 at 03:30, Benno Schulenberg <address@hidden> wrote:
> ---
>  src/move.c  |  4 ++--
>  src/proto.h |  2 +-
>  src/text.c  | 15 +++++++++++----
>  3 files changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/src/move.c b/src/move.c
> index e6dfd7dc..f4264350 100644
> --- a/src/move.c
> +++ b/src/move.c
> @@ -179,7 +179,7 @@ void do_para_begin(bool update_screen)
>         if (openfile->current != openfile->fileage)
>                 openfile->current = openfile->current->prev;
>
> -       while (!begpar(openfile->current))
> +       while (!begpar(openfile->current, 0))
>                 openfile->current = openfile->current->prev;
>
>         openfile->current_x = 0;
> @@ -204,7 +204,7 @@ void do_para_end(bool update_screen)
>
>         while (openfile->current != openfile->filebot &&
>                                 inpar(openfile->current->next) &&
> -                               !begpar(openfile->current->next)) {
> +                               !begpar(openfile->current->next, 0)) {
>                 openfile->current = openfile->current->next;
>         }
>
> diff --git a/src/proto.h b/src/proto.h
> index 2c6f1bda..68de9396 100644
> --- a/src/proto.h
> +++ b/src/proto.h
> @@ -551,7 +551,7 @@ size_t indent_length(const char *line);
>  #endif
>  #ifdef ENABLE_JUSTIFY
>  void justify_format(filestruct *paragraph, size_t skip);
> -bool begpar(const filestruct *const foo);
> +bool begpar(const filestruct *const foo, int depth);
>  bool inpar(const filestruct *const foo);
>  void do_justify(bool full_justify);
>  void do_justify_void(void);
> diff --git a/src/text.c b/src/text.c
> index 2f0f7209..89723011 100644
> --- a/src/text.c
> +++ b/src/text.c
> @@ -1035,7 +1035,7 @@ void do_enter(void)
>                 /* If the next line is in this same paragraph, use its 
> indentation
>                  * as the model, as it is more likely to be what the user 
> wants. */
>                 if (openfile->current->next && inpar(openfile->current->next) 
> &&
> -                                                               
> !begpar(openfile->current->next))
> +                                                               
> !begpar(openfile->current->next, 0))
>                         sampleline = openfile->current->next;
>
>                 extra = indent_length(sampleline->data);
> @@ -1983,8 +1983,11 @@ size_t quote_length(const char *line)
>         return matches.rm_eo;
>  }
>
> +/* The maximum depth of recursion.  This must be an even number. */
> +#define RECURSION_LIMIT 222
> +
>  /* Return TRUE when the given line is the beginning of a paragraph (BOP). */
> -bool begpar(const filestruct *const line)
> +bool begpar(const filestruct *const line, int depth)
>  {
>         size_t quote_len, indent_len, prev_dent_len;
>
> @@ -1993,6 +1996,10 @@ bool begpar(const filestruct *const line)
>         if (line == openfile->fileage)
>                 return TRUE;
>
> +       /* If recursion is going too deep, just say it's not a BOP. */
> +       if (depth > RECURSION_LIMIT)
> +               return FALSE;
> +
>         quote_len = quote_length(line->data);
>         indent_len = indent_length(line->data + quote_len);
>
> @@ -2018,7 +2025,7 @@ bool begpar(const filestruct *const line)
>                 return FALSE;
>
>         /* Otherwise, this is a BOP if the preceding line is not. */
> -       return !begpar(line->prev);
> +       return !begpar(line->prev, depth + 1);
>  }
>
>  /* Return TRUE when the given line is part of a paragraph. */
> @@ -2149,7 +2156,7 @@ bool find_paragraph(size_t *const quote, size_t *const 
> par)
>
>         /* If the current line isn't the first line of the paragraph, move
>          * back to the first line of the paragraph. */
> -       if (!begpar(openfile->current))
> +       if (!begpar(openfile->current, 0))
>                 do_para_begin(FALSE);
>
>         /* Now current is the first line of the paragraph.  Set quote_len to
> --
> 2.17.0
>
>
> _______________________________________________
> Nano-devel mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/nano-devel



-- 
Eitan Adler



reply via email to

[Prev in Thread] Current Thread [Next in Thread]