From 17afc800c9b69997ae7ba52b67c021f68066e008 Mon Sep 17 00:00:00 2001 From: George Nassas Date: Thu, 6 Dec 2007 10:11:05 +0100 Subject: [PATCH] Always call dlopen in DriverOpen. This increases the reference count for the driver binary, preventing it from getting unloaded prematurely in driDestroyDisplay. See https://bugs.freedesktop.org/show_bug.cgi?id=13541 . --- src/glx/x11/dri_glx.c | 8 ++++++-- src/glx/x11/glxclient.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index c02f105611c..9c3a78b31b7 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -194,7 +194,8 @@ static __DRIdriver *OpenDriver(const char *driverName) /* First, search Drivers list to see if we've already opened this driver */ for (driver = Drivers; driver; driver = driver->next) { if (strcmp(driver->name, driverName) == 0) { - /* found it */ + /* found it, increment library refcount & return */ + dlopen(driver->libpath, RTLD_NOW | RTLD_GLOBAL); return driver; } } @@ -238,7 +239,9 @@ static __DRIdriver *OpenDriver(const char *driverName) break; /* out of memory! */ /* init the struct */ driver->name = __glXstrdup(driverName); - if (!driver->name) { + driver->libpath = __glXstrdup(realDriverName); + if (!driver->name || !driver->libpath) { + if (driver->name) XFree(driver->name); Xfree(driver); driver = NULL; break; /* out of memory! */ @@ -401,6 +404,7 @@ static void driDestroyDisplay(Display *dpy, void *private) Drivers = driver->next; Xfree(driver->name); + Xfree(driver->libpath); Xfree(driver); break; } diff --git a/src/glx/x11/glxclient.h b/src/glx/x11/glxclient.h index 05354073c45..7054f3cc310 100644 --- a/src/glx/x11/glxclient.h +++ b/src/glx/x11/glxclient.h @@ -117,6 +117,7 @@ struct __DRIdisplayRec { */ struct __DRIdriverRec { const char *name; + const char *libpath; void *handle; PFNCREATENEWSCREENFUNC createNewScreenFunc; struct __DRIdriverRec *next; -- 2.30.2