]> granicus.if.org Git - graphviz/commit
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)
commitb2d7df03fb74c2ee501a20b292a51a50a82bd1ce
tree190e7f5091529d095817d21f33cfe48e6a79ff4f
parent75142e9426fabc3bfd10b1f0949513b42ccd1b54
GD plugin: fix: zero I/O contexts on creation

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