about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--elf/ldconfig.c13
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c1
4 files changed, 21 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 13ccee2416..3d2fa219a9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-21  HJ Lu  <hongjiu.lu@intel.com>
+
+	* elf/ldconfig.c (search_dir): Treat symlink as regular file
+	if it won't point to itself.
+
 2003-07-20  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/ia64/hp-timing.h (REPEAT_READ): Cast to long int not to int.
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index bb9a3d4c83..1acacb4225 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -787,11 +787,18 @@ search_dir (const struct dir_entry *entry)
       if (real_name != real_file_name)
 	free (real_name);
 
-      /* 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, we treat
+	     it as a normal file.  */
+	  if (strcmp (basename (real_name), soname) != 0)
+	    is_link = 0;
+	  else
+	    {
+	      free (soname);
+	      soname = xstrdup (direntry->d_name);
+	    }
 	}
 
       if (flag == FLAG_ELF
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index c2e50552d8..43ce661be4 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-21  Steven Munroe  <sjmunroe@us.ibm.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/pthread_once.c (__pthread_once):
+	Retry if the stwcx fails to store once_control.
+
 2003-07-20  Ulrich Drepper  <drepper@redhat.com>
 
 	* Makefile (libpthread-routines): Add pthread_attr_getaffinity and
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
index 88acb26e03..ea46cc9023 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/pthread_once.c
@@ -55,6 +55,7 @@ __pthread_once (pthread_once_t *once_control, void (*init_routine) (void))
 			"	andi.	%1,%0,2\n"
 			"	bne	2f\n"
 			"	stwcx.	%4,0,%3\n"
+			"	bne	1b\n"
 			"2:	isync"
 			: "=&r" (oldval), "=&r" (tmp), "=m" (*once_control)
 			: "r" (once_control), "r" (newval), "m" (*once_control)