Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 2 Jan 2017 10:28:46 -0800
From:      Conrad Meyer <cem@freebsd.org>
To:        "Pedro F. Giffuni" <pfg@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r311109 - head/usr.bin/patch
Message-ID:  <CAG6CVpUUFoTZBO0Ja2aSn%2BeMi_BO0u131YKQ1yQumu%2BdRhVY3A@mail.gmail.com>
In-Reply-To: <201701021823.v02INWXc028047@repo.freebsd.org>
References:  <201701021823.v02INWXc028047@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
IMO this patch was mostly fine, you just need to restrict line length
to UINT32_MAX/2 instead of UINT_MAX (== UINT32_MAX) for 32-bit
platforms.

Best,
Conrad

On Mon, Jan 2, 2017 at 10:23 AM, Pedro F. Giffuni <pfg@freebsd.org> wrote:
> Author: pfg
> Date: Mon Jan  2 18:23:31 2017
> New Revision: 311109
> URL: https://svnweb.freebsd.org/changeset/base/311109
>
> Log:
>   Revert r311106:
>   patch(1): extend the maximum length of a line from USHRT_MAX to UINT_MAX.
>
>   This doesn't really work for 32 bit platforms.
>
>   Pointed out by:       kib
>
> Modified:
>   head/usr.bin/patch/patch.c
>   head/usr.bin/patch/pch.c
>   head/usr.bin/patch/pch.h
>
> Modified: head/usr.bin/patch/patch.c
> ==============================================================================
> --- head/usr.bin/patch/patch.c  Mon Jan  2 18:20:22 2017        (r311108)
> +++ head/usr.bin/patch/patch.c  Mon Jan  2 18:23:31 2017        (r311109)
> @@ -749,13 +749,15 @@ rej_line(int ch, LINENUM i)
>         size_t len;
>         const char *line = pfetch(i);
>
> -       len = strnlen(line, UINT_MAX);
> +       len = strnlen(line, USHRT_MAX);
>
>         fprintf(rejfp, "%c%s", ch, line);
> -       if (len == 0 || line[len-1] != '\n')
> -               fprintf(rejfp, "\n\\ No newline at end of line\n");
> -       else if (len >= UINT_MAX)
> -               fprintf(rejfp, "\n\\ Line too long\n");
> +       if (len == 0 || line[len-1] != '\n') {
> +               if (len >= USHRT_MAX)
> +                       fprintf(rejfp, "\n\\ Line too long\n");
> +               else
> +                       fprintf(rejfp, "\n\\ No newline at end of line\n");
> +       }
>  }
>
>  static void
> @@ -1022,7 +1024,7 @@ patch_match(LINENUM base, LINENUM offset
>         LINENUM         pat_lines = pch_ptrn_lines() - fuzz;
>         const char      *ilineptr;
>         const char      *plineptr;
> -       u_int           plinelen;
> +       unsigned short  plinelen;
>
>         for (iline = base + offset + fuzz; pline <= pat_lines; pline++, iline++) {
>                 ilineptr = ifetch(iline, offset >= 0);
>
> Modified: head/usr.bin/patch/pch.c
> ==============================================================================
> --- head/usr.bin/patch/pch.c    Mon Jan  2 18:20:22 2017        (r311108)
> +++ head/usr.bin/patch/pch.c    Mon Jan  2 18:23:31 2017        (r311109)
> @@ -56,7 +56,7 @@ static LINENUM        p_max;          /* max allowed va
>  static LINENUM p_context = 3;  /* # of context lines */
>  static LINENUM p_input_line = 0;       /* current line # from patch file */
>  static char    **p_line = NULL;/* the text of the hunk */
> -static u_int   *p_len = NULL; /* length of each line */
> +static unsigned short  *p_len = NULL; /* length of each line */
>  static char    *p_char = NULL; /* +, -, and ! */
>  static int     hunkmax = INITHUNKMAX;  /* size of above arrays to begin with */
>  static int     p_indent;       /* indent to patch */
> @@ -136,7 +136,7 @@ set_hunkmax(void)
>         if (p_line == NULL)
>                 p_line = malloc(hunkmax * sizeof(char *));
>         if (p_len == NULL)
> -               p_len = malloc(hunkmax * sizeof(u_int));
> +               p_len = malloc(hunkmax * sizeof(unsigned short));
>         if (p_char == NULL)
>                 p_char = malloc(hunkmax * sizeof(char));
>  }
> @@ -153,7 +153,7 @@ grow_hunkmax(void)
>                 fatal("Internal memory allocation error\n");
>
>         p_line = reallocf(p_line, new_hunkmax * sizeof(char *));
> -       p_len = reallocf(p_len, new_hunkmax * sizeof(u_int));
> +       p_len = reallocf(p_len, new_hunkmax * sizeof(unsigned short));
>         p_char = reallocf(p_char, new_hunkmax * sizeof(char));
>
>         if (p_line != NULL && p_len != NULL && p_char != NULL) {
> @@ -1210,7 +1210,7 @@ bool
>  pch_swap(void)
>  {
>         char    **tp_line;      /* the text of the hunk */
> -       u_int   *tp_len;        /* length of each line */
> +       unsigned short  *tp_len;/* length of each line */
>         char    *tp_char;       /* +, -, and ! */
>         LINENUM i;
>         LINENUM n;
> @@ -1367,7 +1367,7 @@ pch_context(void)
>  /*
>   * Return the length of a particular patch line.
>   */
> -u_int
> +unsigned short
>  pch_line_len(LINENUM line)
>  {
>         return p_len[line];
>
> Modified: head/usr.bin/patch/pch.h
> ==============================================================================
> --- head/usr.bin/patch/pch.h    Mon Jan  2 18:20:22 2017        (r311108)
> +++ head/usr.bin/patch/pch.h    Mon Jan  2 18:23:31 2017        (r311109)
> @@ -44,7 +44,7 @@ bool          there_is_another_patch(void);
>  bool           another_hunk(void);
>  bool           pch_swap(void);
>  char           *pfetch(LINENUM);
> -u_int          pch_line_len(LINENUM);
> +unsigned short pch_line_len(LINENUM);
>  LINENUM                pch_first(void);
>  LINENUM                pch_ptrn_lines(void);
>  LINENUM                pch_newfirst(void);
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAG6CVpUUFoTZBO0Ja2aSn%2BeMi_BO0u131YKQ1yQumu%2BdRhVY3A>