[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