aboutsummaryrefslogtreecommitdiff
path: root/elf/cache.c
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 /elf/cache.c
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.
Diffstat (limited to 'elf/cache.c')
-rw-r--r--elf/cache.c16
1 files changed, 14 insertions, 2 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. */