]> granicus.if.org Git - graphviz/commitdiff
GD plugin: fix: zero I/O contexts on creation
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 3 Mar 2022 06:33:39 +0000 (22:33 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 13 Mar 2022 17:16:39 +0000 (10:16 -0700)
The GD plugin was creating `gdIOCtx` objects on the stack with some
uninitialized members. At time of writing, the GD docs¹ claim this struct’s
layout is:

  typedef struct gdIOCtx
  {
    int (*getC)(gdIOCtxPtr);
    int (*getBuf)(gdIOCtxPtr, void *, int wanted);

    void (*putC)(gdIOCtxPtr, int);
    int (*putBuf)(gdIOCtxPtr, const void *, int wanted);

    // seek must return 1 on SUCCESS, 0 on FAILURE. Unlike fseek!
    int (*seek)(gdIOCtxPtr, const int);
    long (*tell)(gdIOCtxPtr);

    void (*gd_free)(gdIOCtxPtr);
  } gdIOCtx;

So Graphviz’ usage was leaving `getC`, `getBuf`, `seek`, and `gd_free`
uninitialized. This seems to work out OK; Graphviz’ usage of libgd apparently
does not involve any code paths that use these members. But this does not seem
to be an API guarantee. This change zeroes these members for future stability.

¹ https://libgd.github.io/manuals/2.3.3/files/gd_io-h.html#gdIOCtx

plugin/gd/gvdevice_gd.c
plugin/gd/gvrender_gd.c

index dcb8552aaa8f44c1c19753c78349ea6f28979fa4..94dc392cfe73f3105014b935ddf8aebfe489a850 100644 (file)
@@ -46,7 +46,7 @@ static void gd_format(GVJ_t * job)
     unsigned int *data = (unsigned int*)(job->imagedata);
     unsigned int width = job->width;
     unsigned int height = job->height;
-    gdIOCtx ctx;
+    gdIOCtx ctx = {0};
 
     ctx.putBuf = gvdevice_gd_putBuf;
     ctx.putC = gvdevice_gd_putC;
index 46cc298e3072cd5e21e7ea412527f8fc784efa62..6c93fb866274bc59727bd35e5433a4c4bb44241b 100644 (file)
@@ -150,7 +150,7 @@ static void gdgen_end_page(GVJ_t * job)
 {
     gdImagePtr im = (gdImagePtr) job->context;
 
-    gdIOCtx ctx;
+    gdIOCtx ctx = {0};
 
     ctx.putBuf = gvdevice_gd_putBuf;
     ctx.putC = gvdevice_gd_putC;