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);
>