glx: Fix leaks in DRI2 screen creation error paths.

Signed-off-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Henri Verbeet
2011-01-29 15:00:48 -08:00
committed by Brian Paul
parent cbe9fc12a6
commit bfc889517a
3 changed files with 29 additions and 15 deletions
+10 -4
View File
@@ -804,11 +804,14 @@ dri2CreateScreen(int screen, struct glx_display * priv)
return NULL;
memset(psc, 0, sizeof *psc);
if (!glx_screen_init(&psc->base, screen, priv))
return NULL;
if (!glx_screen_init(&psc->base, screen, priv)) {
Xfree(psc);
return NULL;
}
if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen),
&driverName, &deviceName)) {
glx_screen_cleanup(&psc->base);
XFree(psc);
return NULL;
}
@@ -918,12 +921,15 @@ dri2CreateScreen(int screen, struct glx_display * priv)
return &psc->base;
handle_error:
if (psc->fd)
close(psc->fd);
if (psc->driver)
dlclose(psc->driver);
Xfree(driverName);
Xfree(deviceName);
glx_screen_cleanup(&psc->base);
XFree(psc);
/* FIXME: clean up here */
return NULL;
}
+2
View File
@@ -585,6 +585,8 @@ struct glx_display
extern int
glx_screen_init(struct glx_screen *psc,
int screen, struct glx_display * priv);
extern void
glx_screen_cleanup(struct glx_screen *psc);
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
extern __GLXDRIdrawable *
+17 -11
View File
@@ -194,17 +194,7 @@ FreeScreenConfigs(struct glx_display * priv)
screens = ScreenCount(priv->dpy);
for (i = 0; i < screens; i++) {
psc = priv->screens[i];
if (psc->configs) {
glx_config_destroy_list(psc->configs);
if (psc->effectiveGLXexts)
Xfree(psc->effectiveGLXexts);
psc->configs = NULL; /* NOTE: just for paranoia */
}
if (psc->visuals) {
glx_config_destroy_list(psc->visuals);
psc->visuals = NULL; /* NOTE: just for paranoia */
}
Xfree((char *) psc->serverGLXexts);
glx_screen_cleanup(psc);
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
if (psc->driScreen) {
@@ -728,6 +718,22 @@ glx_screen_init(struct glx_screen *psc,
return GL_TRUE;
}
_X_HIDDEN void
glx_screen_cleanup(struct glx_screen *psc)
{
if (psc->configs) {
glx_config_destroy_list(psc->configs);
if (psc->effectiveGLXexts)
Xfree(psc->effectiveGLXexts);
psc->configs = NULL; /* NOTE: just for paranoia */
}
if (psc->visuals) {
glx_config_destroy_list(psc->visuals);
psc->visuals = NULL; /* NOTE: just for paranoia */
}
Xfree((char *) psc->serverGLXexts);
}
/*
** Allocate the memory for the per screen configs for each screen.
** If that works then fetch the per screen configs data.