diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-08-25 18:37:54 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-08-25 18:37:54 +0000 |
commit | 062df960458326de96ff41af51b92bcb56053129 (patch) | |
tree | ac738c13f1bf5d6019f8c8f79ae8b42f74f729b5 /elf/cache.c | |
parent | 47ceb39de3ef6668215ee952b3b7ed99367bf969 (diff) | |
download | glibc-062df960458326de96ff41af51b92bcb56053129.tar.gz glibc-062df960458326de96ff41af51b92bcb56053129.tar.xz glibc-062df960458326de96ff41af51b92bcb56053129.zip |
(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.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/elf/cache.c b/elf/cache.c index eda1ce2d8e..22ad55c612 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. */ |