From d63dd7f5b73aa67938e7381df690b31c5030a83c Mon Sep 17 00:00:00 2001 From: lars Date: Sat, 25 Apr 2009 15:21:25 +0000 Subject: [PATCH] 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 --- .../patches/010-cleanup-saved-builtins.patch | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 Xorg/xorg/lib/libXfont/patches/010-cleanup-saved-builtins.patch diff --git a/Xorg/xorg/lib/libXfont/patches/010-cleanup-saved-builtins.patch b/Xorg/xorg/lib/libXfont/patches/010-cleanup-saved-builtins.patch new file mode 100644 index 000000000..7c3accfd0 --- /dev/null +++ b/Xorg/xorg/lib/libXfont/patches/010-cleanup-saved-builtins.patch @@ -0,0 +1,185 @@ +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);