aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-08-25 18:37:54 +0000
committerUlrich Drepper <drepper@redhat.com>2003-08-25 18:37:54 +0000
commit062df960458326de96ff41af51b92bcb56053129 (patch)
treeac738c13f1bf5d6019f8c8f79ae8b42f74f729b5
parent47ceb39de3ef6668215ee952b3b7ed99367bf969 (diff)
downloadglibc-062df960458326de96ff41af51b92bcb56053129.zip
glibc-062df960458326de96ff41af51b92bcb56053129.tar.gz
glibc-062df960458326de96ff41af51b92bcb56053129.tar.bz2
(save_cache): Don't write beyond end of file_entries buffer. Duplicate last old cache entry if the count would be odd.
-rw-r--r--elf/cache.c16
-rw-r--r--localedata/locales/wa_BE4
-rw-r--r--localedata/locales/yi_US4
3 files changed, 18 insertions, 6 deletions
diff --git a/elf/cache.c b/elf/cache.c
index eda1ce2..22ad55c 100644
--- a/elf/cache.c
+++ b/elf/cache.c
@@ -305,6 +305,13 @@ save_cache (const char *cache_name)
if (opt_format != 2)
{
+ /* struct cache_file_new is 64-bit aligned on some arches while
+ only 32-bit aligned on other arches. Duplicate last old
+ cache entry so that new cache in ld.so.cache can be used by
+ both. */
+ if (opt_format != 0)
+ cache_entry_old_count = (cache_entry_old_count + 1) & ~1;
+
/* And the list of all entries in the old format. */
file_entries_size = sizeof (struct cache_file)
+ cache_entry_old_count * sizeof (struct file_entry);
@@ -351,7 +358,7 @@ save_cache (const char *cache_name)
entry = entry->next, ++idx_new)
{
/* First the library. */
- if (opt_format != 2)
+ if (opt_format != 2 && entry->hwcap == 0)
{
file_entries->libs[idx_old].flags = entry->flags;
/* XXX: Actually we can optimize here and remove duplicates. */
@@ -374,7 +381,7 @@ save_cache (const char *cache_name)
++str;
str_offset += len + 1;
/* Then the path. */
- if (opt_format != 2)
+ if (opt_format != 2 && entry->hwcap == 0)
file_entries->libs[idx_old].value = str_offset + pad;
if (opt_format != 0)
file_entries_new->libs[idx_new].value = str_offset;
@@ -388,6 +395,11 @@ save_cache (const char *cache_name)
++idx_old;
}
+ /* Duplicate last old cache entry if needed. */
+ if (opt_format != 2
+ && idx_old < cache_entry_old_count)
+ file_entries->libs[idx_old] = file_entries->libs[idx_old - 1];
+
/* Write out the cache. */
/* Write cache first to a temporary file and rename it later. */
diff --git a/localedata/locales/wa_BE b/localedata/locales/wa_BE
index b5eb5c7..05ad590 100644
--- a/localedata/locales/wa_BE
+++ b/localedata/locales/wa_BE
@@ -11,8 +11,8 @@ email "Djan_Sacre@skynet.be, pablo@mandrakesoft.com"
address ""
tel ""
fax ""
-language "wa"
-territory "BE"
+language "Walloon"
+territory "Belgium"
revision "0.7"
date "2002-02-11"
diff --git a/localedata/locales/yi_US b/localedata/locales/yi_US
index 22d5963..f993d0c 100644
--- a/localedata/locales/yi_US
+++ b/localedata/locales/yi_US
@@ -11,8 +11,8 @@ contact "Pablo Saratxaga"
email "pablo@mandrakesoft.com"
tel ""
fax ""
-language "yi"
-territory "US"
+language "Yiddish"
+territory "USA"
revision "0.3"
date "2001-01-28"