aboutsummaryrefslogtreecommitdiff
path: root/elf/ldconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/ldconfig.c')
-rw-r--r--elf/ldconfig.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index 444dc73750..64c4f64727 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -787,16 +787,33 @@ search_dir (const struct dir_entry *entry)
continue;
}
- /* Links will just point to itself. */
+
+ /* A link may just point to itself. */
if (is_link)
{
- free (soname);
- soname = xstrdup (direntry->d_name);
- }
+ /* If the path the link points to isn't its soname and it is not
+ .so symlink for ld(1) only, we treat it as a normal file. */
+ char *real_base_name = basename (real_name);
+
+ if (strcmp (real_base_name, soname) != 0)
+ {
+ len = strlen (real_base_name);
+ if (len < strlen (".so")
+ || strcmp (real_base_name + len - strlen (".so"), ".so") != 0
+ || strncmp (real_base_name, soname, len) != 0)
+ is_link = 0;
+ }
+ }
if (real_name != real_file_name)
free (real_name);
+ if (is_link)
+ {
+ free (soname);
+ soname = xstrdup (direntry->d_name);
+ }
+
if (flag == FLAG_ELF
&& (entry->flag == FLAG_ELF_LIBC5
|| entry->flag == FLAG_ELF_LIBC6))