dri: Fix the logger error message handling.
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. Reviewed-by: Keith Packard <keithp@keithp.com> Tested-by: Keith Packard <keithp@keithp.com> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
@@ -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;
|
||||
|
@@ -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".
|
||||
|
@@ -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 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);
|
||||
|
Reference in New Issue
Block a user