Commit f340b64f authored by Andrew Nguyen's avatar Andrew Nguyen Committed by Alexandre Julliard

winex11.drv: Avoid relying on PATH_MAX in X11DRV_FONT_InitX11Metrics helper.

parent 093ae8b6
...@@ -1824,21 +1824,20 @@ static void XFONT_LoadIgnores( HKEY hkey ) ...@@ -1824,21 +1824,20 @@ static void XFONT_LoadIgnores( HKEY hkey )
* Returns expanded name for the cachedmetrics file. * Returns expanded name for the cachedmetrics file.
* Now it also appends the current value of the $DISPLAY variable. * 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 *confdir = wine_get_config_dir();
const char *display_name = XDisplayName(NULL); const char *display_name = XDisplayName(NULL);
int len = strlen(confdir) + strlen(INIFontMetrics) + strlen(display_name) + 8; int len = strlen(confdir) + strlen(INIFontMetrics) + strlen(display_name) + 8;
char *buffer;
unsigned int display = 0; unsigned int display = 0;
unsigned int screen = 0; unsigned int screen = 0;
char *p, *ext; char *p, *ext;
if (!(buffer = HeapAlloc(GetProcessHeap(), 0, len)))
if ((len > *buf_size) &&
!(buffer = HeapReAlloc( GetProcessHeap(), 0, buffer, *buf_size = len )))
{ {
ERR("out of memory\n"); ERR("out of memory\n");
ExitProcess(1); return NULL;
} }
sprintf( buffer, "%s/%s", confdir, INIFontMetrics ); sprintf( buffer, "%s/%s", confdir, INIFontMetrics );
...@@ -2890,9 +2889,9 @@ static void X11DRV_FONT_InitX11Metrics( void ) ...@@ -2890,9 +2889,9 @@ static void X11DRV_FONT_InitX11Metrics( void )
{ {
char** x_pattern; char** x_pattern;
unsigned x_checksum; unsigned x_checksum;
int i, x_count, buf_size; int i, x_count;
char *buffer; char *buffer = NULL;
HKEY hkey; HKEY hkey = NULL;
XFontStruct* x_fs; XFontStruct* x_fs;
char fontcheck_name[] = "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1"; char fontcheck_name[] = "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1";
...@@ -2907,48 +2906,48 @@ static void X11DRV_FONT_InitX11Metrics( void ) ...@@ -2907,48 +2906,48 @@ static void X11DRV_FONT_InitX11Metrics( void )
for( i = x_checksum = 0; i < x_count; i++ ) for( i = x_checksum = 0; i < x_count; i++ )
{ {
int j; int j;
#if 0
printf("%i\t: %s\n", i, x_pattern[i] );
#endif
j = strlen( x_pattern[i] ); j = strlen( x_pattern[i] );
if( j ) x_checksum ^= __genericCheckSum( x_pattern[i], j ); if( j ) x_checksum ^= __genericCheckSum( x_pattern[i], j );
} }
x_checksum |= X_PFONT_MAGIC; x_checksum |= X_PFONT_MAGIC;
buf_size = PATH_MAX;
buffer = HeapAlloc( GetProcessHeap(), 0, buf_size );
/* deal with systemwide font metrics cache */ /* deal with systemwide font metrics cache */
buffer[0] = 0;
/* @@ Wine registry key: HKCU\Software\Wine\X11 Driver\Fonts */ /* @@ Wine registry key: HKCU\Software\Wine\X11 Driver\Fonts */
if (RegOpenKeyA(HKEY_CURRENT_USER, INIFontSection, &hkey)) hkey = 0; if (RegOpenKeyA(HKEY_CURRENT_USER, INIFontSection, &hkey) == ERROR_SUCCESS)
if (hkey)
{ {
DWORD type, count = buf_size; DWORD type, count = 0;
RegQueryValueExA(hkey, INIGlobalMetrics, 0, &type, (LPBYTE)buffer, &count); if (RegQueryValueExA(hkey, INIGlobalMetrics, NULL, &type, NULL, &count) == ERROR_SUCCESS &&
} type == REG_SZ)
if( buffer[0] )
{ {
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); TRACE("system fontcache is '%s'\n", buffer);
XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count);
} }
HeapFree(GetProcessHeap(), 0, buffer);
buffer = NULL;
}
}
if (fontList == NULL) if (fontList == NULL)
{ {
/* try per-user */ /* try per-user */
buffer = XFONT_UserMetricsCache( buffer, &buf_size ); buffer = XFONT_UserMetricsCache();
if( buffer[0] ) if (buffer)
{ {
TRACE("user fontcache is '%s'\n", buffer); TRACE("user fontcache is '%s'\n", buffer);
XFONT_ReadCachedMetrics(buffer, DefResolution, x_checksum, x_count); 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); 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 ); int fd = open( buffer, O_CREAT | O_TRUNC | O_RDWR, 0666 );
if ( fd < 0 ) if ( fd < 0 )
...@@ -2963,6 +2962,8 @@ static void X11DRV_FONT_InitX11Metrics( void ) ...@@ -2963,6 +2962,8 @@ static void X11DRV_FONT_InitX11Metrics( void )
} }
} }
HeapFree(GetProcessHeap(), 0, buffer);
wine_tsx11_lock(); wine_tsx11_lock();
XFreeFontNames(x_pattern); XFreeFontNames(x_pattern);
...@@ -2975,8 +2976,6 @@ static void X11DRV_FONT_InitX11Metrics( void ) ...@@ -2975,8 +2976,6 @@ static void X11DRV_FONT_InitX11Metrics( void )
wine_tsx11_unlock(); wine_tsx11_unlock();
HeapFree(GetProcessHeap(), 0, buffer);
XFONT_WindowsNames(); XFONT_WindowsNames();
XFONT_LoadAliases( hkey ); XFONT_LoadAliases( hkey );
if (hkey) XFONT_LoadDefaults( hkey ); if (hkey) XFONT_LoadDefaults( hkey );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment