From f340b64fb892c54bc3ccb95b8ff60ab92c3d3025 Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Mon, 11 Oct 2010 05:19:52 -0500 Subject: [PATCH] winex11.drv: Avoid relying on PATH_MAX in X11DRV_FONT_InitX11Metrics helper. --- dlls/winex11.drv/xfont.c | 67 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/dlls/winex11.drv/xfont.c b/dlls/winex11.drv/xfont.c index 374590be5ca..307ee09dbb3 100644 --- a/dlls/winex11.drv/xfont.c +++ b/dlls/winex11.drv/xfont.c @@ -1824,21 +1824,20 @@ static void XFONT_LoadIgnores( HKEY hkey ) * Returns expanded name for the cachedmetrics file. * Now it also appends the current value of the $DISPLAY variable. */ -static char* XFONT_UserMetricsCache( char* buffer, int* buf_size ) +static char* XFONT_UserMetricsCache(void) { const char *confdir = wine_get_config_dir(); const char *display_name = XDisplayName(NULL); int len = strlen(confdir) + strlen(INIFontMetrics) + strlen(display_name) + 8; + char *buffer; unsigned int display = 0; unsigned int screen = 0; char *p, *ext; - - if ((len > *buf_size) && - !(buffer = HeapReAlloc( GetProcessHeap(), 0, buffer, *buf_size = len ))) + if (!(buffer = HeapAlloc(GetProcessHeap(), 0, len))) { ERR("out of memory\n"); - ExitProcess(1); + return NULL; } sprintf( buffer, "%s/%s", confdir, INIFontMetrics ); @@ -2890,9 +2889,9 @@ static void X11DRV_FONT_InitX11Metrics( void ) { char** x_pattern; unsigned x_checksum; - int i, x_count, buf_size; - char *buffer; - HKEY hkey; + int i, x_count; + char *buffer = NULL; + HKEY hkey = NULL; XFontStruct* x_fs; char fontcheck_name[] = "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1"; @@ -2907,48 +2906,48 @@ static void X11DRV_FONT_InitX11Metrics( void ) for( i = x_checksum = 0; i < x_count; i++ ) { int j; -#if 0 - printf("%i\t: %s\n", i, x_pattern[i] ); -#endif j = strlen( x_pattern[i] ); if( j ) x_checksum ^= __genericCheckSum( x_pattern[i], j ); } x_checksum |= X_PFONT_MAGIC; - buf_size = PATH_MAX; - buffer = HeapAlloc( GetProcessHeap(), 0, buf_size ); /* deal with systemwide font metrics cache */ - buffer[0] = 0; /* @@ Wine registry key: HKCU\Software\Wine\X11 Driver\Fonts */ - if (RegOpenKeyA(HKEY_CURRENT_USER, INIFontSection, &hkey)) hkey = 0; - if (hkey) + if (RegOpenKeyA(HKEY_CURRENT_USER, INIFontSection, &hkey) == ERROR_SUCCESS) { - DWORD type, count = buf_size; - RegQueryValueExA(hkey, INIGlobalMetrics, 0, &type, (LPBYTE)buffer, &count); + DWORD type, count = 0; + if (RegQueryValueExA(hkey, INIGlobalMetrics, NULL, &type, NULL, &count) == ERROR_SUCCESS && + type == REG_SZ) + { + buffer = HeapAlloc(GetProcessHeap(), 0, count + 1); + if (RegQueryValueExA(hkey, INIGlobalMetrics, NULL, NULL, (LPBYTE)buffer, &count) == ERROR_SUCCESS) + { + buffer[count] = '\0'; + TRACE("system fontcache is '%s'\n", buffer); + XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); + } + HeapFree(GetProcessHeap(), 0, buffer); + buffer = NULL; + } } - if( buffer[0] ) - { - TRACE("system fontcache is '%s'\n", buffer); - XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); - } if (fontList == NULL) { - /* try per-user */ - buffer = XFONT_UserMetricsCache( buffer, &buf_size ); - if( buffer[0] ) - { - TRACE("user fontcache is '%s'\n", buffer); - XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); - } + /* try per-user */ + buffer = XFONT_UserMetricsCache(); + if (buffer) + { + TRACE("user fontcache is '%s'\n", buffer); + XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); + } } - if( fontList == NULL ) /* build metrics from scratch */ + if (fontList == NULL) /* build metrics from scratch */ { int n_ff = XFONT_BuildMetrics(x_pattern, DefResolution, x_checksum, x_count); - if( buffer[0] ) /* update cached metrics */ + if( buffer ) /* update cached metrics */ { int fd = open( buffer, O_CREAT | O_TRUNC | O_RDWR, 0666 ); if ( fd < 0 ) @@ -2963,6 +2962,8 @@ static void X11DRV_FONT_InitX11Metrics( void ) } } + HeapFree(GetProcessHeap(), 0, buffer); + wine_tsx11_lock(); XFreeFontNames(x_pattern); @@ -2975,8 +2976,6 @@ static void X11DRV_FONT_InitX11Metrics( void ) wine_tsx11_unlock(); - HeapFree(GetProcessHeap(), 0, buffer); - XFONT_WindowsNames(); XFONT_LoadAliases( hkey ); if (hkey) XFONT_LoadDefaults( hkey );