diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/glx/x11/dri_glx.c | 21 | 
1 files changed, 16 insertions, 5 deletions
| diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c index 508dceb84d..0875361d0b 100644 --- a/src/glx/x11/dri_glx.c +++ b/src/glx/x11/dri_glx.c @@ -183,6 +183,7 @@ static const char createNewScreenName[] = "__driCreateNewScreen_20050727";   */  static __DRIdriver *OpenDriver(const char *driverName)  { +   void *glhandle = NULL;     char *libPaths = NULL;     char libDir[1000];     int i; @@ -196,6 +197,9 @@ static __DRIdriver *OpenDriver(const char *driverName)        }     } +   /* Attempt to make sure libGL symbols will be visible to the driver */ +   glhandle = dlopen("libGL.so.1", RTLD_NOW | RTLD_GLOBAL); +     if (geteuid() == getuid()) {        /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */        libPaths = getenv("LIBGL_DRIVERS_PATH"); @@ -229,12 +233,13 @@ static __DRIdriver *OpenDriver(const char *driverName)           /* allocate __DRIdriver struct */           driver = (__DRIdriver *) Xmalloc(sizeof(__DRIdriver));           if (!driver) -            return NULL; /* out of memory! */ +            break; /* out of memory! */           /* init the struct */           driver->name = __glXstrdup(driverName);           if (!driver->name) {              Xfree(driver); -            return NULL; /* out of memory! */ +            driver = NULL; +            break; /* out of memory! */           }           driver->createNewScreenFunc = (PFNCREATENEWSCREENFUNC) @@ -248,6 +253,7 @@ static __DRIdriver *OpenDriver(const char *driverName)  			  "Your driver may be too old for this libGL.\n",  			  createNewScreenName, driverName);              Xfree(driver); +            driver = NULL;              dlclose(handle);              continue;           } @@ -255,15 +261,20 @@ static __DRIdriver *OpenDriver(const char *driverName)           /* put at head of linked list */           driver->next = Drivers;           Drivers = driver; -         return driver; +         break;        }        else {  	 ErrorMessageF("dlopen %s failed (%s)\n", realDriverName, dlerror());        }     } -   ErrorMessageF("unable to find driver: %s_dri.so\n", driverName); -   return NULL; +   if (!driver) +      ErrorMessageF("unable to load driver: %s_dri.so\n", driverName); + +   if (glhandle) +      dlclose(glhandle); + +   return driver;  } | 
