]> granicus.if.org Git - graphviz/commitdiff
gvRenderData outputs non-null terminated string and string length, reduced reallocations
authorglenlow <devnull@localhost>
Sat, 2 Feb 2008 06:42:23 +0000 (06:42 +0000)
committerglenlow <devnull@localhost>
Sat, 2 Feb 2008 06:42:23 +0000 (06:42 +0000)
lib/gvc/gvc.h
lib/gvc/gvdevice.c
tclpkg/gv/gv.cpp

index d8103e5fe69adc80837b91de532ab3aef77f62bc..cd417ec212f9a5d8545bc27274ddf1029b1d7849 100644 (file)
@@ -91,7 +91,7 @@ extern int gvRender(GVC_t *gvc, graph_t *g, char *format, FILE *out);
 extern int gvRenderFilename(GVC_t *gvc, graph_t *g, char *format, char *filename);
 
 /* Render layout in a specified format to a malloc'ed string */
-extern int gvRenderData(GVC_t *gvc, graph_t *g, char *format, char **result);
+extern int gvRenderData(GVC_t *gvc, graph_t *g, char *format, char **result, unsigned int *length);
 
 /* Render layout according to -T and -o options found by gvParseArgs */
 extern int gvRenderJobs(GVC_t *gvc, graph_t *g);
index fd44b2b341e147f14285f939ad3d0070f52defc9..0c4058afe1d3c961ccd9b2fc7694ba076b748a6e 100644 (file)
@@ -49,6 +49,8 @@
 #include "gvcint.h"
 #include "gvcproc.h"
 
+static const int PAGE_ALIGN = 4095;            /* align to a 4K boundary (less one), typical for Linux, Mac OS X and Windows memory allocation */
+
 size_t gvdevice_write (GVJ_t * job, const unsigned char *s, unsigned int len)
 {
     if (job->gvc->write_fn && job->output_file == stdout)   /* externally provided write dicipline */
@@ -59,15 +61,15 @@ size_t gvdevice_write (GVJ_t * job, const unsigned char *s, unsigned int len)
 #endif
     }
     else if (job->output_data) {
-       if (len > (job->output_data_allocated - (job->output_data_position + 1))) {
-           job->output_data_allocated = job->output_data_position + len + 1000;
+       if (len > job->output_data_allocated - job->output_data_position) {
+           job->output_data_allocated = (job->output_data_position + len + PAGE_ALIGN) & ~PAGE_ALIGN;
            job->output_data = realloc(job->output_data, job->output_data_allocated);
            if (!job->output_data) {
                fprintf(stderr, "failure realloc'ing for result string\n");
                return 0;
            }
        }
-       strcpy(job->output_data + job->output_data_position, (char*)s);
+       memcpy(job->output_data + job->output_data_position, s, len);
         job->output_data_position += len;
        return len;
     }
index 38614b618ec5ccf4b23e41d41c35d46626145f2d..e43d31f8f1fa87ca9335b3f67020c30945f30a14 100644 (file)
@@ -873,9 +873,12 @@ char* renderdata(Agraph_t *g, char *format)
 {
     int err;
     char *data;
+       unsigned int length;
 
-    err = gvRenderData(gvc, g, format, &data);
+    err = gvRenderData(gvc, g, format, &data, &length);
     if (err) return NULL;
+       data = (char*)realloc(data, length + 1);
+       if (data) data[length] = '\0';
     return data;
 }