]> granicus.if.org Git - graphviz/commitdiff
fix: suppress Xlib finalization if initialization failed
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 2 Aug 2020 00:13:04 +0000 (17:13 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 8 Aug 2020 01:08:53 +0000 (18:08 -0700)
The initialization function of a device plugin has no way of reporting failure
to its called. So an attempt to use the x11 back end calls xlib_finalize() even
if xlib_initialize() failed. To make this safe, we set a flag if initialization
succeeds and make xlib_finalize() a no-op if the flag is not set. Fixes #1776.

CHANGELOG.md
plugin/xlib/gvdevice_xlib.c

index f01e9fe5cd4fba273bdf0ca3c1ee523bef214fd6..30d9920bc039afb40d52bcd9e19f8d6ece1a091f 100644 (file)
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - heap-over-flow(off-by-null) in lib/common/shapes.c #1700
 - Windows MSBuild executables have the wrong version #1745
 - Cast Overflow at pango_textlayout #1314
+- x11 back end segfaults if display is unavailable #1776
 
 ## [2.44.1] - 2020-06-29
 
index 9350e34d8d22d314846f193fd80635a0a8d681d8..ed2b0e85510f79b3b5dcc97792e4e21a8e36677f 100644 (file)
@@ -452,6 +452,8 @@ static int handle_file_events(GVJ_t *job, int inotify_fd)
 }
 #endif
 
+static boolean initialized;
+
 static void xlib_initialize(GVJ_t *firstjob)
 {
     Display *dpy;
@@ -489,6 +491,8 @@ static void xlib_initialize(GVJ_t *firstjob)
     firstjob->device_dpi.x = DisplayWidth(dpy, scr) * 25.4 / DisplayWidthMM(dpy, scr);
     firstjob->device_dpi.y = DisplayHeight(dpy, scr) * 25.4 / DisplayHeightMM(dpy, scr);
     firstjob->device_sets_dpi = TRUE;
+
+    initialized = TRUE;
 }
 
 static void xlib_finalize(GVJ_t *firstjob)
@@ -514,6 +518,11 @@ static void xlib_finalize(GVJ_t *firstjob)
     }
 #endif
 
+    /* skip if initialization previously failed */
+    if (!initialized) {
+        return;
+    }
+
     numfds = xlib_fd = XConnectionNumber(dpy);
 
     if (firstjob->input_filename) {