summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glx/dri2_glx.c23
-rw-r--r--src/glx/dri_common.c2
-rw-r--r--src/glx/dri_glx.c21
-rw-r--r--src/glx/drisw_glx.c23
4 files changed, 54 insertions, 15 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index 940626c2020..553869a53f9 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -865,6 +865,7 @@ dri2CreateScreen(int screen, struct glx_display * priv)
priv->dri2Display;
struct dri2_screen *psc;
__GLXDRIscreen *psp;
+ struct glx_config *configs = NULL, *visuals = NULL;
char *driverName, *deviceName;
drm_magic_t magic;
int i;
@@ -947,10 +948,16 @@ dri2CreateScreen(int screen, struct glx_display * priv)
extensions = psc->core->getExtensions(psc->driScreen);
dri2BindExtensions(psc, extensions);
- psc->base.configs =
- driConvertConfigs(psc->core, psc->base.configs, driver_configs);
- psc->base.visuals =
- driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+ configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
+ visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+
+ if (!configs || !visuals)
+ goto handle_error;
+
+ glx_config_destroy_list(psc->base.configs);
+ psc->base.configs = configs;
+ glx_config_destroy_list(psc->base.visuals);
+ psc->base.visuals = visuals;
psc->driver_configs = driver_configs;
@@ -994,10 +1001,18 @@ dri2CreateScreen(int screen, struct glx_display * priv)
return &psc->base;
handle_error:
+ if (configs)
+ glx_config_destroy_list(configs);
+ if (visuals)
+ glx_config_destroy_list(visuals);
+ if (psc->driScreen)
+ psc->core->destroyScreen(psc->driScreen);
+ psc->driScreen = NULL;
if (psc->fd >= 0)
close(psc->fd);
if (psc->driver)
dlclose(psc->driver);
+
Xfree(driverName);
Xfree(deviceName);
glx_screen_cleanup(&psc->base);
diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
index eb62c824f35..1482b88bd93 100644
--- a/src/glx/dri_common.c
+++ b/src/glx/dri_common.c
@@ -340,8 +340,6 @@ driConvertConfigs(const __DRIcoreExtension * core,
tail = tail->next;
}
- glx_config_destroy_list(configs);
-
return head.next;
}
diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c
index a52159c0657..666423a7b15 100644
--- a/src/glx/dri_glx.c
+++ b/src/glx/dri_glx.c
@@ -336,7 +336,7 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
drm_handle_t hFB;
int junk;
const __DRIconfig **driver_configs;
- struct glx_config *visual;
+ struct glx_config *visual, *configs = NULL, *visuals = NULL;
/* DRI protocol version. */
dri_version.major = driDpy->driMajor;
@@ -446,10 +446,16 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
goto handle_error;
}
- psc->base.configs =
- driConvertConfigs(psc->core, psc->base.configs, driver_configs);
- psc->base.visuals =
- driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+ configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
+ visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+
+ if (!configs || !visuals)
+ goto handle_error;
+
+ glx_config_destroy_list(psc->base.configs);
+ psc->base.configs = configs;
+ glx_config_destroy_list(psc->base.visuals);
+ psc->base.visuals = visuals;
psc->driver_configs = driver_configs;
@@ -478,6 +484,11 @@ CallCreateNewScreen(Display *dpy, int scrn, struct dri_screen *psc,
return psp;
handle_error:
+ if (configs)
+ glx_config_destroy_list(configs);
+ if (visuals)
+ glx_config_destroy_list(visuals);
+
if (pSAREA != MAP_FAILED)
drmUnmap(pSAREA, SAREA_MAX);
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index a150c618b18..fbc6be272c0 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -524,6 +524,7 @@ driswCreateScreen(int screen, struct glx_display *priv)
const __DRIconfig **driver_configs;
const __DRIextension **extensions;
struct drisw_screen *psc;
+ struct glx_config *configs = NULL, *visuals = NULL;
int i;
psc = Xcalloc(1, sizeof *psc);
@@ -569,10 +570,16 @@ driswCreateScreen(int screen, struct glx_display *priv)
extensions = psc->core->getExtensions(psc->driScreen);
driswBindExtensions(psc, extensions);
- psc->base.configs =
- driConvertConfigs(psc->core, psc->base.configs, driver_configs);
- psc->base.visuals =
- driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+ configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
+ visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+
+ if (!configs || !visuals)
+ goto handle_error;
+
+ glx_config_destroy_list(psc->base.configs);
+ psc->base.configs = configs;
+ glx_config_destroy_list(psc->base.visuals);
+ psc->base.visuals = visuals;
psc->driver_configs = driver_configs;
@@ -586,6 +593,14 @@ driswCreateScreen(int screen, struct glx_display *priv)
return &psc->base;
handle_error:
+ if (configs)
+ glx_config_destroy_list(configs);
+ if (visuals)
+ glx_config_destroy_list(visuals);
+ if (psc->driScreen)
+ psc->core->destroyScreen(psc->driScreen);
+ psc->driScreen = NULL;
+
if (psc->driver)
dlclose(psc->driver);
glx_screen_cleanup(&psc->base);