Module: wine Branch: master Commit: f340b64fb892c54bc3ccb95b8ff60ab92c3d3025 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f340b64fb892c54bc3ccb95b8f...
Author: Andrew Nguyen anguyen@codeweavers.com Date: Mon Oct 11 05:19:52 2010 -0500
winex11.drv: Avoid relying on PATH_MAX in X11DRV_FONT_InitX11Metrics helper.
---
dlls/winex11.drv/xfont.c | 67 ++++++++++++++++++++++----------------------- 1 files changed, 33 insertions(+), 34 deletions(-)
diff --git a/dlls/winex11.drv/xfont.c b/dlls/winex11.drv/xfont.c index 374590b..307ee09 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 );