glx: Fix leaks in DRI2 screen creation error paths.
Signed-off-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
committed by
Brian Paul
parent
cbe9fc12a6
commit
bfc889517a
+10
-4
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user