]> granicus.if.org Git - graphviz/commitdiff
duplicate backing memory for plugin typestr
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 30 May 2020 02:01:39 +0000 (19:01 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 6 Jun 2020 00:35:25 +0000 (17:35 -0700)
Following this change, plugins no longer retain a typestr pointer that was
malloced elsewhere. This lets the memory for plugins be manged more orthogonally
to other concerns. Related to #1543.

lib/gvc/gvcint.h
lib/gvc/gvcontext.c
lib/gvc/gvplugin.c

index 7b2a1f11945e4a3de2bb88bd90bf44b998974956..0f8c21aeba36c8d5280b1b70e6395fed29decb33 100644 (file)
@@ -49,7 +49,7 @@ extern "C" {
 
     struct gvplugin_available_s {
        gvplugin_available_t *next;     /* next plugin in linked list, or NULL */
-       const char *typestr;            /* type string, e.g. "png" or "ps" */
+       char *typestr;          /* type string, e.g. "png" or "ps" */
        int quality;                    /* Programmer assigned quality ranking within type (+ve or -ve int).
                                        First implementation of type should be given "0" quality */
        gvplugin_package_t *package;    /* details of library containing plugin */
index 73ca5a71c204936ef349a9f19b86214861512d74..c29d8e2eff7a48c22aa21171be47ef4a4a4bd4b9 100644 (file)
@@ -103,6 +103,7 @@ int gvFreeContext(GVC_t * gvc)
     for (i = 0; i != num_apis; ++i) {
        for (api = gvc->apis[i]; api != NULL; api = api_next) {
            api_next = api->next;
+           free(api->typestr);
            free(api);
        }
     }
index 99b98b1b2862d7c3aa64f38cc6bd539f60fd0830..d10222f17f3c897146c5622e5eb5ba0be27cf7d7 100644 (file)
@@ -85,7 +85,12 @@ boolean gvplugin_install(GVC_t * gvc, api_t api, const char *typestr,
 {
     gvplugin_available_t *plugin, **pnext;
 #define TYPSIZ 63
-    char *p, pins[TYPSIZ + 1], pnxt[TYPSIZ + 1];
+    char *p, *t, pins[TYPSIZ + 1], pnxt[TYPSIZ + 1];
+
+    /* duplicate typestr to later save in the plugin list */
+    t = strdup(typestr);
+    if (t == NULL)
+        return FALSE;
 
     strncpy(pins, typestr, TYPSIZ);
     if ((p = strchr(pins, ':')))
@@ -119,7 +124,7 @@ boolean gvplugin_install(GVC_t * gvc, api_t api, const char *typestr,
     plugin = GNEW(gvplugin_available_t);
     plugin->next = *pnext;
     *pnext = plugin;
-    plugin->typestr = typestr;
+    plugin->typestr = t;
     plugin->quality = quality;
     plugin->package = package;
     plugin->typeptr = typeptr;  /* null if not loaded */