summary refs log tree commit diff
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.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.c16
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.  */