[Mesa-dev] [PATCH 5/7] dri: Fix the logger error message handling.

Eric Anholt eric at anholt.net
Thu Jan 23 15:12:13 PST 2014


Since the loader changes, there has been a compiler warning that the
prototype didn't match.  It turns out that if a loader error message was
ever thrown, you'd segfault because of trying to use the warning level as
a format string.
---
 src/glx/dri3_glx.c   |  2 +-
 src/glx/dri_common.c | 25 +++++++++++++++++++++++++
 src/glx/dri_common.h | 10 ++++++++--
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 3e82965..2a9f0b7 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -1803,7 +1803,7 @@ dri3_create_display(Display * dpy)
    pdp->base.destroyDisplay = dri3_destroy_display;
    pdp->base.createScreen = dri3_create_screen;
 
-   loader_set_logger(ErrorMessageF);
+   loader_set_logger(dri_message);
    i = 0;
 
    pdp->loader_extensions[i++] = &imageLoaderExtension.base;
diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
index b5058c9..93c45ea 100644
--- a/src/glx/dri_common.c
+++ b/src/glx/dri_common.c
@@ -40,6 +40,7 @@
 #include <stdarg.h>
 #include "glxclient.h"
 #include "dri_common.h"
+#include "loader.h"
 
 #ifndef RTLD_NOW
 #define RTLD_NOW 0
@@ -48,6 +49,30 @@
 #define RTLD_GLOBAL 0
 #endif
 
+_X_HIDDEN void
+dri_message(int level, const char *f, ...)
+{
+   va_list args;
+   int threshold = _LOADER_WARNING;
+   const char *libgl_debug;
+
+   libgl_debug = getenv("LIBGL_DEBUG");
+   if (libgl_debug) {
+      if (strstr(libgl_debug, "quiet"))
+         threshold = _LOADER_FATAL;
+      else if (strstr(libgl_debug, "verbose"))
+         threshold = _LOADER_DEBUG;
+   }
+
+   /* Note that the _LOADER_* levels are lower numbers for more severe. */
+   if (level <= threshold) {
+      fprintf(stderr, "libGL%s: ", level <= _LOADER_WARNING ? " error" : "");
+      va_start(args, f);
+      vfprintf(stderr, f, args);
+      va_end(args);
+   }
+}
+
 /**
  * Print informational message to stderr if LIBGL_DEBUG is set to
  * "verbose".
diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h
index 4fe0d3f..425d89f 100644
--- a/src/glx/dri_common.h
+++ b/src/glx/dri_common.h
@@ -39,6 +39,12 @@
 #include <GL/internal/dri_interface.h>
 #include <stdbool.h>
 
+#if (__GNUC__ >= 3)
+#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
+#else
+#define PRINTFLIKE(f, a)
+#endif
+
 typedef struct __GLXDRIconfigPrivateRec __GLXDRIconfigPrivate;
 
 struct __GLXDRIconfigPrivateRec
@@ -61,10 +67,10 @@ driReleaseDrawables(struct glx_context *gc);
 
 extern const __DRIsystemTimeExtension systemTimeExtension;
 
-extern void InfoMessageF(const char *f, ...);
+extern void dri_message(int level, const char *f, ...) PRINTFLIKE(2, 3);
 
+extern void InfoMessageF(const char *f, ...);
 extern void ErrorMessageF(const char *f, ...);
-
 extern void CriticalErrorMessageF(const char *f, ...);
 
 extern void *driOpenDriver(const char *driverName);
-- 
1.8.5.3



More information about the mesa-dev mailing list