packages/Xorg/xorg/lib/libXfont/patches/010-cleanup-saved-builtins.patch
lars d63dd7f5b7 Cleanup the saved_builtin_dir mess. Fixes that the xserver crashed when it was
restarted.


git-svn-id: svn://svn.openwrt.org/openwrt/packages@15406 3c298f89-4303-0410-b956-a3cf2f4a3e73
2009-04-25 15:21:25 +00:00

186 lines
5.0 KiB
Diff

diff --git a/src/builtins/dir.c b/src/builtins/dir.c
index 1f7f547..3a8d944 100644
--- a/src/builtins/dir.c
+++ b/src/builtins/dir.c
@@ -29,172 +29,32 @@
#endif
#include "builtin.h"
-static BuiltinDirPtr
-BuiltinDirsDup (const BuiltinDirPtr a_dirs,
- int a_dirs_len)
-{
- BuiltinDirPtr dirs=NULL ;
- int i=0 ;
-
- if (!a_dirs)
- return NULL ;
-
- dirs = xcalloc (a_dirs_len, sizeof (BuiltinDirRec)) ;
- if (!dirs)
- return NULL ;
-
- for (i=0; i < a_dirs_len; i++) {
- int len = strlen (a_dirs[i].file_name) ;
- dirs[i].file_name = xcalloc (1, len) ;
- memmove (dirs[i].file_name, a_dirs[i].file_name, len);
- len = strlen (a_dirs[i].font_name) ;
- dirs[i].font_name = xcalloc (1, len) ;
- memmove (dirs[i].font_name, a_dirs[i].font_name, len);
- }
- return dirs ;
-}
-
-/**
- * Copy a_save back into a_cur
- * @param a_cur the instance of BuiltinDir to restore
- * @param a_saved the saved instance of BuiltinDir to copy into a_cur
- * @return 0 if went okay, 1 otherwise.
- */
-static int
-BuiltinDirRestore (BuiltinDirPtr a_cur,
- const BuiltinDirPtr a_saved)
-{
- if (!a_cur)
- return 1 ;
- if (!a_saved)
- return 0 ;
-
- if (a_saved->font_name)
- memmove (a_cur->font_name, a_saved->font_name, strlen (a_saved->font_name)) ;
- return 0 ;
-}
-
-
-static int
-BuiltinDirsRestore (BuiltinDirPtr a_cur_tab,
- const BuiltinDirPtr a_saved_tab,
- int a_tab_len)
-{
- int i=0 ;
-
- if (!a_cur_tab)
- return 1 ;
- if (!a_saved_tab)
- return 0 ;
-
- for (i=0 ; i < a_tab_len; i++) {
- if (BuiltinDirRestore (&a_cur_tab[i], &a_saved_tab[i]))
- return 1 ;
- }
- return 0 ;
-}
-
-static BuiltinAliasPtr
-BuiltinAliasesDup (const BuiltinAliasPtr a_aliases,
- int a_aliases_len)
-{
- BuiltinAliasPtr aliases=NULL ;
- int i=0 ;
-
- if (!a_aliases)
- return NULL ;
-
- aliases = xcalloc (a_aliases_len, sizeof (BuiltinAliasRec)) ;
- if (!aliases)
- return NULL ;
-
- for (i=0; i < a_aliases_len; i++) {
- int len = strlen (a_aliases[i].font_name) ;
- aliases[i].font_name = xcalloc (1, len) ;
- memmove (aliases[i].font_name, a_aliases[i].font_name, len);
- }
- return aliases ;
-}
-
-/**
- * Copy a_save back into a_cur
- * @param a_cur the instance of BuiltinAlias to restore
- * @param a_saved the saved instance of BuiltinAlias to copy into a_cur
- * @return 0 if went okay, 1 otherwise.
- */
-static int
-BuiltinAliasRestore (BuiltinAliasPtr a_cur,
- const BuiltinAliasPtr a_save)
-{
- if (!a_cur)
- return 1 ;
- if (!a_save)
- return 0 ;
- if (a_save->alias_name)
- memmove (a_cur->alias_name, a_save->alias_name, strlen (a_save->alias_name)) ;
- if (a_save->font_name)
- memmove (a_cur->font_name, a_save->font_name, strlen (a_save->font_name)) ;
- return 0 ;
-}
-
-static int
-BuiltinAliasesRestore (BuiltinAliasPtr a_cur_tab,
- const BuiltinAliasPtr a_saved_tab,
- int a_tab_len)
-{
- int i=0 ;
-
- if (!a_cur_tab)
- return 1 ;
- if (!a_saved_tab)
- return 0 ;
-
- for (i=0 ; i < a_tab_len; i++) {
- if (BuiltinAliasRestore (&a_cur_tab[i], &a_saved_tab[i]))
- return 1 ;
- }
- return 0 ;
-}
-
int
BuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir)
{
FontDirectoryPtr dir;
int i;
- static BuiltinDirPtr saved_builtin_dir;
- static BuiltinAliasPtr saved_builtin_alias;
+ static char **builtin_dir_font_name_copy = NULL;
dir = FontFileMakeDir ("", builtin_dir_count);
- if (saved_builtin_dir)
- {
- BuiltinDirsRestore ((BuiltinDirPtr) builtin_dir,
- saved_builtin_dir,
- builtin_dir_count) ;
- }
- else
- {
- saved_builtin_dir = BuiltinDirsDup ((const BuiltinDirPtr) builtin_dir,
- builtin_dir_count) ;
- }
-
- if (saved_builtin_alias)
+ if (!builtin_dir_font_name_copy)
{
- BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias,
- saved_builtin_alias,
- builtin_alias_count) ;
+ builtin_dir_font_name_copy = malloc (sizeof(char*) * builtin_dir_count);
+ for (i = 0; i < builtin_dir_count; ++i)
+ builtin_dir_font_name_copy[i] = strdup(builtin_dir[i].font_name);
}
else
{
- saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias,
- builtin_alias_count) ;
+ for (i = 0; i < builtin_dir_count; ++i)
+ strcpy(builtin_dir_font_name_copy[i], builtin_dir[i].font_name);
}
for (i = 0; i < builtin_dir_count; i++)
{
if (!FontFileAddFontFile (dir,
- (char *) builtin_dir[i].font_name,
+ (char *) builtin_dir_font_name_copy[i],
(char *) builtin_dir[i].file_name))
{
FontFileFreeDir (dir);