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