]> granicus.if.org Git - graphviz/commitdiff
xlib plugin handle_file_events: more tightly scope a long-lived dynamic buffer
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 31 Mar 2022 00:16:20 +0000 (17:16 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 2 Apr 2022 19:55:48 +0000 (12:55 -0700)
This buffer was being retained in a long-lived `static` pointer, increasing peak
memory usage and making it harder to use tools like Valgrind and ASan with
Graphviz. This change makes it more obvious to both users and tools what this
buffer is used for.

Note this also tweaks an error message to be more informative.

plugin/xlib/gvdevice_xlib.c

index 2124ae764670a658b477cc5625f53204e5694121..201ad55ca5631dce72dbcda1e5e9aa484cc98c4b 100644 (file)
@@ -405,7 +405,6 @@ static int handle_stdin_events(GVJ_t *job)
 static int handle_file_events(GVJ_t *job, int inotify_fd)
 {
     int avail, ret, len, ln, rc = 0;
-    static char *buf;
     char *bf, *p;
     struct inotify_event *event;
 
@@ -416,14 +415,17 @@ static int handle_file_events(GVJ_t *job, int inotify_fd)
     }
 
     if (avail) {
-        buf = realloc(buf, avail);
+        assert(avail > 0 && "invalid value from FIONREAD");
+        void *buf = malloc((size_t)avail);
         if (!buf) {
-            fprintf(stderr,"problem with realloc(%d)\n", avail);
+            fprintf(stderr, "out of memory (could not allocate %d bytes)\n",
+                    avail);
             return -1;
         }
         len = read(inotify_fd, buf, avail);
         if (len != avail) {
             fprintf(stderr,"avail = %u, len = %u\n", avail, len);
+            free(buf);
             return -1;
         }
         bf = buf;
@@ -464,6 +466,7 @@ static int handle_file_events(GVJ_t *job, int inotify_fd)
             bf += ln;
             len -= ln;
         }
+        free(buf);
         if (len != 0) {
             fprintf(stderr,"length miscalculation, len = %d\n", len);
             return -1;