Any takers?

On 06/22/17 21:32, Martijn van Duren wrote:
> Hello tech@,
> 
> Attached a patch to remove the binc function from vi and replace it with
> recallocarray. The functions effectively do the same thing since
> BINC_{GOTO,RET} already do the nlen > llen comparison. I've run
> this without any issues, but since recallocarray does extra checks and
> binc ALWAYS allocates A LOT more than requested there might be some
> bugs lurking.
> 
> I haven't changed the name since the size component is always one and
> hence they don't expose a similar interface.
> 
> OK?
> 
> martijn@
> 
> Index: common/mem.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/common/mem.h,v
> retrieving revision 1.9
> diff -u -p -r1.9 mem.h
> --- common/mem.h      7 May 2016 14:03:01 -0000       1.9
> +++ common/mem.h      22 Jun 2017 19:02:28 -0000
> @@ -14,30 +14,30 @@
>  /* Increase the size of a malloc'd buffer.  Two versions, one that
>   * returns, one that jumps to an error label.
>   */
> -#define      BINC_GOTO(sp, lp, llen, nlen) {                                 
> \
> -     void *L__bincp;                                                 \
> +#define      BINC_GOTO(sp, p, llen, nlen) {                                  
> \
> +     void *tmpp;                                                     \
>       if ((nlen) > (llen)) {                                          \
> -             if ((L__bincp = binc((sp), (lp), &(llen), (nlen)))      \
> -                 == NULL)                                            \
> +             if (((tmpp) = recallocarray((p), (llen), (nlen), 1))    \
> +                 == NULL) {                                          \
> +                     msgq((sp), M_SYSERR, NULL);                     \
> +                     free(p);                                        \
>                       goto alloc_err;                                 \
> -             /*                                                      \
> -              * !!!                                                  \
> -              * Possible pointer conversion.                         \
> -              */                                                     \
> -             (lp) = L__bincp;                                        \
> +             }                                                       \
> +             llen = nlen;                                            \
> +             (p) = tmpp;                                             \
>       }                                                               \
>  }
> -#define      BINC_RET(sp, lp, llen, nlen) {                                  
> \
> -     void *L__bincp;                                                 \
> +#define      BINC_RET(sp, p, llen, nlen) {                                   
> \
> +     void *tmpp;                                                     \
>       if ((nlen) > (llen)) {                                          \
> -             if ((L__bincp = binc((sp), (lp), &(llen), (nlen)))      \
> -                 == NULL)                                            \
> +             if (((tmpp) = recallocarray((p), (llen), (nlen), 1))    \
> +                 == NULL) {                                          \
> +                     msgq((sp), M_SYSERR, NULL);                     \
> +                     free(p);                                        \
>                       return (1);                                     \
> -             /*                                                      \
> -              * !!!                                                  \
> -              * Possible pointer conversion.                         \
> -              */                                                     \
> -             (lp) = L__bincp;                                        \
> +             }                                                       \
> +             llen = nlen;                                            \
> +             (p) = tmpp;                                             \
>       }                                                               \
>  }
>  
> Index: common/util.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/common/util.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 util.c
> --- common/util.c     27 May 2016 09:18:11 -0000      1.15
> +++ common/util.c     22 Jun 2017 19:02:28 -0000
> @@ -24,43 +24,6 @@
>  
>  #include "common.h"
>  
> -#define MAXIMUM(a, b)        (((a) > (b)) ? (a) : (b))
> -
> -/*
> - * binc --
> - *   Increase the size of a buffer.
> - *
> - * PUBLIC: void *binc(SCR *, void *, size_t *, size_t);
> - */
> -void *
> -binc(SCR *sp, void *bp, size_t *bsizep, size_t min)
> -{
> -     size_t csize;
> -
> -     /* If already larger than the minimum, just return. */
> -     if (min && *bsizep >= min)
> -             return (bp);
> -
> -     csize = *bsizep + MAXIMUM(min, 256);
> -     REALLOC(sp, bp, csize);
> -
> -     if (bp == NULL) {
> -             /*
> -              * Theoretically, realloc is supposed to leave any already
> -              * held memory alone if it can't get more.  Don't trust it.
> -              */
> -             *bsizep = 0;
> -             return (NULL);
> -     }
> -     /*
> -      * Memory is guaranteed to be zero-filled, various parts of
> -      * nvi depend on this.
> -      */
> -     memset((char *)bp + *bsizep, 0, csize - *bsizep);
> -     *bsizep = csize;
> -     return (bp);
> -}
> -
>  /*
>   * nonblank --
>   *   Set the column number of the first non-blank character
> Index: include/com_extern.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/include/com_extern.h,v
> retrieving revision 1.14
> diff -u -p -r1.14 com_extern.h
> --- include/com_extern.h      27 May 2016 09:18:12 -0000      1.14
> +++ include/com_extern.h      22 Jun 2017 19:02:28 -0000
> @@ -103,7 +103,6 @@ void seq_close(GS *);
>  int seq_dump(SCR *, seq_t, int);
>  int seq_save(SCR *, FILE *, char *, seq_t);
>  int e_memcmp(CHAR_T *, EVENT *, size_t);
> -void *binc(SCR *, void *, size_t *, size_t);
>  int nonblank(SCR *, recno_t, size_t *);
>  CHAR_T *v_strdup(SCR *, const CHAR_T *, size_t);
>  enum nresult nget_uslong(u_long *, const char *, char **, int);
> 

Reply via email to