Module: wine Branch: master Commit: c642481305fb9de241760e1aa8d13943d8bc8120 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c642481305fb9de241760e1aa8... Author: Francois Gouget <fgouget(a)free.fr> Date: Tue May 26 00:52:05 2009 +0200 winex11.drv: Replace an strdup() with HeapAlloc() in the OpenGL code. Free the corresponding memory when the library is unloaded. --- dlls/winex11.drv/opengl.c | 15 ++++++++++++--- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index b15b4e2..30eb95b 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -76,7 +76,7 @@ typedef struct wine_glextension { struct WineGLInfo { const char *glVersion; - const char *glExtensions; + char *glExtensions; int glxVersion[2]; @@ -274,12 +274,13 @@ MAKE_FUNCPTR(glFinish) MAKE_FUNCPTR(glFlush) #undef MAKE_FUNCPTR +static BOOL infoInitialized = FALSE; static BOOL X11DRV_WineGL_InitOpenglInfo(void) { - static BOOL infoInitialized = FALSE; int screen = DefaultScreen(gdi_display); Window win = RootWindow(gdi_display, screen); + const char* str; Visual *visual; XVisualInfo template; XVisualInfo *vis; @@ -318,7 +319,9 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) } WineGLInfo.glVersion = (const char *) pglGetString(GL_VERSION); - WineGLInfo.glExtensions = strdup((const char *) pglGetString(GL_EXTENSIONS)); + str = (const char *) pglGetString(GL_EXTENSIONS); + WineGLInfo.glExtensions = HeapAlloc(GetProcessHeap(), 0, strlen(str)+1); + strcpy(WineGLInfo.glExtensions, str); /* Get the common GLX version supported by GLX client and server ( major/minor) */ pglXQueryVersion(gdi_display, &WineGLInfo.glxVersion[0], &WineGLInfo.glxVersion[1]); @@ -352,6 +355,12 @@ static BOOL X11DRV_WineGL_InitOpenglInfo(void) return TRUE; } +void X11DRV_OpenGL_Cleanup(void) +{ + HeapFree(GetProcessHeap(), 0, WineGLInfo.glExtensions); + infoInitialized = FALSE; +} + static BOOL has_opengl(void) { static int init_done; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 7d0b2ba..b11e6a1 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -226,6 +226,7 @@ extern int CDECL X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev, PIXELFORMATDESCRIPTOR *ppfd); extern int CDECL X11DRV_GetPixelFormat(X11DRV_PDEVICE *physDev); extern BOOL CDECL X11DRV_SwapBuffers(X11DRV_PDEVICE *physDev); +extern void X11DRV_OpenGL_Cleanup(void); /* X11 driver internal functions */ diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 020d6b5..41c866c 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -587,6 +587,7 @@ static void process_detach(void) /* cleanup GDI */ X11DRV_GDI_Finalize(); + X11DRV_OpenGL_Cleanup(); IME_UnregisterClasses(); DeleteCriticalSection( &X11DRV_CritSection );