From: Jacek Caban jacek@codeweavers.com
--- dlls/opengl32/unix_wgl.c | 74 +++++++++++----------------------------- 1 file changed, 20 insertions(+), 54 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index f7eaaa54336..3d9017ade3c 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1411,11 +1411,17 @@ struct wow64_string_entry static struct wow64_string_entry *wow64_strings; static SIZE_T wow64_strings_count;
-static PTR32 find_wow64_string( const char *str, PTR32 wow64_str ) +static NTSTATUS return_wow64_string( const void *str, PTR32 *wow64_str ) { void *tmp; SIZE_T i;
+ if (!str) + { + *wow64_str = 0; + return STATUS_SUCCESS; + } + pthread_mutex_lock( &wgl_lock );
for (i = 0; i < wow64_strings_count; i++) if (wow64_strings[i].str == str) break; @@ -1428,16 +1434,18 @@ static PTR32 find_wow64_string( const char *str, PTR32 wow64_str ) }
if (i == wow64_strings_count) ERR( "Failed to allocate memory for wow64 strings\n" ); - else if (wow64_strings[i].wow64_str) wow64_str = wow64_strings[i].wow64_str; - else if (wow64_str) + else if (wow64_strings[i].wow64_str) *wow64_str = wow64_strings[i].wow64_str; + else if (*wow64_str) { - strcpy( UlongToPtr(wow64_str), (char *)str ); - wow64_strings[i].wow64_str = wow64_str; + strcpy( UlongToPtr(*wow64_str), str ); + wow64_strings[i].wow64_str = *wow64_str; }
pthread_mutex_unlock( &wgl_lock );
- return wow64_str; + if (*wow64_str) return STATUS_SUCCESS; + *wow64_str = strlen( str ) + 1; + return STATUS_BUFFER_TOO_SMALL; }
NTSTATUS wow64_ext_wglCreatePbufferARB( void *args ) @@ -1521,14 +1529,7 @@ NTSTATUS wow64_gl_glGetString( void *args ) NTSTATUS status;
if ((status = gl_glGetString( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( (char *)params.ret, params32->ret ))) - { - params32->ret = strlen( (char *)params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
NTSTATUS wow64_ext_glGetStringi( void *args ) @@ -1549,14 +1550,7 @@ NTSTATUS wow64_ext_glGetStringi( void *args ) NTSTATUS status;
if ((status = ext_glGetStringi( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( (char *)params.ret, params32->ret ))) - { - params32->ret = strlen( (char *)params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
NTSTATUS wow64_ext_glPathGlyphIndexRangeNV( void *args ) @@ -1604,14 +1598,7 @@ NTSTATUS wow64_ext_wglGetExtensionsStringARB( void *args ) NTSTATUS status;
if ((status = ext_wglGetExtensionsStringARB( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( params.ret, params32->ret ))) - { - params32->ret = strlen( params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
NTSTATUS wow64_ext_wglGetExtensionsStringEXT( void *args ) @@ -1628,14 +1615,7 @@ NTSTATUS wow64_ext_wglGetExtensionsStringEXT( void *args ) NTSTATUS status;
if ((status = ext_wglGetExtensionsStringEXT( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( params.ret, params32->ret ))) - { - params32->ret = strlen( params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
NTSTATUS wow64_ext_wglQueryCurrentRendererStringWINE( void *args ) @@ -1654,14 +1634,7 @@ NTSTATUS wow64_ext_wglQueryCurrentRendererStringWINE( void *args ) NTSTATUS status;
if ((status = ext_wglQueryCurrentRendererStringWINE( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( params.ret, params32->ret ))) - { - params32->ret = strlen( params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
NTSTATUS wow64_ext_wglQueryRendererStringWINE( void *args ) @@ -1684,14 +1657,7 @@ NTSTATUS wow64_ext_wglQueryRendererStringWINE( void *args ) NTSTATUS status;
if ((status = ext_wglQueryRendererStringWINE( ¶ms ))) return status; - - if (!(params32->ret = find_wow64_string( params.ret, params32->ret ))) - { - params32->ret = strlen( params.ret ) + 1; - return STATUS_BUFFER_TOO_SMALL; - } - - return STATUS_SUCCESS; + return return_wow64_string( params.ret, ¶ms32->ret ); }
GLenum wow64_glClientWaitSync( TEB *teb, GLsync sync, GLbitfield flags, GLuint64 timeout )