]> granicus.if.org Git - graphviz/commitdiff
cgraph: replace unchecked agxbuf allocations with alloc helpers
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 30 Apr 2022 23:44:22 +0000 (16:44 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Wed, 11 May 2022 05:24:16 +0000 (22:24 -0700)
These allocations are at the core of some work Graphviz does and were not
checked for failure. This change swaps confusing crashes on out-of-memory for a
more graceful exit.

lib/cgraph/agxbuf.c

index 627e02b3f785c8553951af33d6a00f534de2f2cd..eef13d6321902a912757365a845ab2311f766adf 100644 (file)
@@ -14,8 +14,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <cgraph/agxbuf.h>
-
-#define N_GNEW(n,t)     calloc((n),sizeof(t))
+#include <cgraph/alloc.h>
 
 /* agxbinit:
  * Assume if init is non-null, hint = sizeof(init[])
@@ -29,7 +28,7 @@ void agxbinit(agxbuf * xb, unsigned int hint, unsigned char *init)
        if (hint == 0)
            hint = BUFSIZ;
        xb->dyna = 1;
-       xb->buf = N_GNEW(hint, unsigned char);
+       xb->buf = gv_calloc(hint, sizeof(unsigned char));
     }
     xb->eptr = xb->buf + hint;
     xb->ptr = xb->buf;
@@ -52,9 +51,9 @@ void agxbmore(agxbuf * xb, size_t ssz)
        nsize = size + ssz;
     cnt = (size_t) (xb->ptr - xb->buf);
     if (xb->dyna) {
-       nbuf = realloc(xb->buf, nsize);
+       nbuf = gv_recalloc(xb->buf, size, nsize, sizeof(unsigned char));
     } else {
-       nbuf = N_GNEW(nsize, unsigned char);
+       nbuf = gv_calloc(nsize, sizeof(unsigned char));
        memcpy(nbuf, xb->buf, cnt);
        xb->dyna = 1;
     }