about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--libio/oldiopopen.c28
-rw-r--r--linuxthreads/ChangeLog4
-rw-r--r--linuxthreads/Examples/ex17.c17
-rw-r--r--linuxthreads/tst-context.c6
-rw-r--r--sysdeps/unix/sysv/linux/bits/socket.h4
-rw-r--r--sysdeps/unix/sysv/linux/cmsg_nxthdr.c4
-rw-r--r--sysdeps/unix/sysv/linux/i386/makecontext.S16
8 files changed, 66 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 695637fabc..bca582b887 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,14 @@
 2001-07-31  Ulrich Drepper  <drepper@redhat.com>
 
+	* sysdeps/unix/sysv/linux/cmsg_nxthdr.c (__cmsg_nxthdr): Correct
+	test for cmsg struct size.
+	* sysdeps/unix/sysv/linux/bits/socket.h (__cmsg_nxthdr): Likewise.
+
+	* sysdeps/unix/sysv/linux/i386/makecontext.S: Remove unnecessary
+	initializations.
+
 	* libio/iopopen.c: Add lock for proc_file_chain access.
+	* libio/oldiopopen.c: Add lock for old_proc_file_chain access.
 	Reported by Padraig Brady <Padraig@linux.ie>.
 
 2001-07-31  Andreas Jaeger  <aj@suse.de>
diff --git a/libio/oldiopopen.c b/libio/oldiopopen.c
index ed4e3d241b..d18a2a4338 100644
--- a/libio/oldiopopen.c
+++ b/libio/oldiopopen.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998,99,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Written by Per Bothner <bothner@cygnus.com>.
 
@@ -109,6 +109,16 @@ typedef struct _IO_proc_file _IO_proc_file;
 
 static struct _IO_proc_file *old_proc_file_chain;
 
+#ifdef _IO_MTSAFE_IO
+static _IO_lock_t proc_file_chain_lock = _IO_lock_initializer;
+
+static void
+unlock (void *not_used)
+{
+  _IO_lock_unlock (proc_file_chain_lock);
+}
+#endif
+
 _IO_FILE *
 _IO_old_proc_open (fp, command, mode)
      _IO_FILE *fp;
@@ -173,8 +183,16 @@ _IO_old_proc_open (fp, command, mode)
   _IO_fileno (fp) = parent_end;
 
   /* Link into old_proc_file_chain. */
+#ifdef _IO_MTSFE_IO
+  _IO_cleanup_region_start_noarg (unlock);
+  _IO_lock_lock (proc_file_chain_lock);
+#endif
   ((_IO_proc_file *) fp)->next = old_proc_file_chain;
   old_proc_file_chain = (_IO_proc_file *) fp;
+#ifdef _IO_MTSFE_IO
+  _IO_lock_unlock (proc_file_chain_lock);
+  _IO_cleanup_region_end (0);
+#endif
 
   _IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES);
   return fp;
@@ -229,6 +247,10 @@ _IO_old_proc_close (fp)
   int status = -1;
 
   /* Unlink from old_proc_file_chain. */
+#ifdef _IO_MTSFE_IO
+  _IO_cleanup_region_start_noarg (unlock);
+  _IO_lock_lock (proc_file_chain_lock);
+#endif
   for ( ; *ptr != NULL; ptr = &(*ptr)->next)
     {
       if (*ptr == (_IO_proc_file *) fp)
@@ -238,6 +260,10 @@ _IO_old_proc_close (fp)
 	  break;
 	}
     }
+#ifdef _IO_MTSFE_IO
+  _IO_lock_unlock (proc_file_chain_lock);
+  _IO_cleanup_region_end (0);
+#endif
 
   if (status < 0 || _IO_close (_IO_fileno(fp)) < 0)
     return -1;
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index d38b8a7cf9..b4c51749ef 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,7 @@
+2001-07-31  Ulrich Drepper  <drepper@redhat.com>
+
+	* Examples/ex17.c: Make sure test thread is around long enough.
+
 2001-07-26  kaz Kojima  <kkojima@rr.iij4u.or.jp>
 
 	* sysdeps/sh/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF): Defined.
diff --git a/linuxthreads/Examples/ex17.c b/linuxthreads/Examples/ex17.c
index f5c99ee3fb..a3ab909990 100644
--- a/linuxthreads/Examples/ex17.c
+++ b/linuxthreads/Examples/ex17.c
@@ -6,9 +6,12 @@
 #include <limits.h>
 #include <sys/mman.h>
 
+static pthread_mutex_t synch = PTHREAD_MUTEX_INITIALIZER;
+
 static void *
 test_thread (void *v_param)
 {
+  pthread_mutex_lock (&synch);
   return NULL;
 }
 
@@ -56,6 +59,13 @@ main (void)
       return 2;
     }
 
+  status = pthread_mutex_lock (&synch);
+  if (status != 0)
+    {
+      printf ("cannot get lock: %s\n", strerror (status));
+      return 1;
+    }
+
   status = pthread_create (&thread, &attr, test_thread, NULL);
   if (status != 0)
     {
@@ -85,6 +95,13 @@ main (void)
       return 3;
     }
 
+  status = pthread_mutex_unlock (&synch);
+  if (status != 0)
+    {
+      printf ("cannot release lock: %s\n", strerror (status));
+      return 1;
+    }
+
   /* pthread_detach (thread); */
   if (pthread_join (thread, NULL) != 0)
     {
diff --git a/linuxthreads/tst-context.c b/linuxthreads/tst-context.c
index 82a877cffe..c72b2ac101 100644
--- a/linuxthreads/tst-context.c
+++ b/linuxthreads/tst-context.c
@@ -28,6 +28,12 @@ threadfct (void *arg)
 {
   int n = (int) (long int) arg;
 
+  if (getcontext (&ctx[n][1]) != 0)
+    {
+      printf ("%d: cannot get context: %m\n", n);
+      exit (1);
+    }
+
   printf ("%d: %s: before makecontext\n", n, __FUNCTION__);
 
   ctx[n][1].uc_stack.ss_sp = stacks[n];
diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h
index 0ec83ccff2..6ad4a5ed92 100644
--- a/sysdeps/unix/sysv/linux/bits/socket.h
+++ b/sysdeps/unix/sysv/linux/bits/socket.h
@@ -268,8 +268,8 @@ __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW
 
   __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
 			       + CMSG_ALIGN (__cmsg->cmsg_len));
-  if ((unsigned char *) (__cmsg + 1) >= ((unsigned char *) __mhdr->msg_control
-					 + __mhdr->msg_controllen)
+  if ((unsigned char *) (__cmsg + 1) > ((unsigned char *) __mhdr->msg_control
+					+ __mhdr->msg_controllen)
       || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
 	  > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
     /* No more entries.  */
diff --git a/sysdeps/unix/sysv/linux/cmsg_nxthdr.c b/sysdeps/unix/sysv/linux/cmsg_nxthdr.c
index 22daab5ee3..b7de285e34 100644
--- a/sysdeps/unix/sysv/linux/cmsg_nxthdr.c
+++ b/sysdeps/unix/sysv/linux/cmsg_nxthdr.c
@@ -29,8 +29,8 @@ __cmsg_nxthdr (struct msghdr *mhdr, struct cmsghdr *cmsg)
 
   cmsg = (struct cmsghdr *) ((unsigned char *) cmsg
 			     + CMSG_ALIGN (cmsg->cmsg_len));
-  if ((unsigned char *) (cmsg + 1) >= ((unsigned char *) mhdr->msg_control
-				       + mhdr->msg_controllen)
+  if ((unsigned char *) (cmsg + 1) > ((unsigned char *) mhdr->msg_control
+				      + mhdr->msg_controllen)
       || ((unsigned char *) cmsg + CMSG_ALIGN (cmsg->cmsg_len)
 	  > ((unsigned char *) mhdr->msg_control + mhdr->msg_controllen)))
     /* No more entries.  */
diff --git a/sysdeps/unix/sysv/linux/i386/makecontext.S b/sysdeps/unix/sysv/linux/i386/makecontext.S
index 1ca3233945..56b5537ce3 100644
--- a/sysdeps/unix/sysv/linux/i386/makecontext.S
+++ b/sysdeps/unix/sysv/linux/i386/makecontext.S
@@ -40,22 +40,6 @@ ENTRY(__makecontext)
 	movl	oLINK(%eax), %ecx
 	movl	%ecx, -4(%edx)
 
-	/* Copy the FS and GS segment register.  */
-	xorl	%ecx, %ecx
-	movw	%gs, %cx
-	movl	%ecx, oGS(%eax)
-	xorl	%ecx, %ecx
-	movw	%fs, %cx
-	movl	%ecx, oFS(%eax)
-
-	/* We have separate floating-point register content memory on the
-	   stack.  We use the __fpregs_mem block in the context.  Set the
-	   links up correctly.  */
-	leal	oFPREGSMEM(%eax), %ecx
-	movl	%ecx, oFPREGS(%eax)
-	/* Save the floating-point context.  */
-	fnstenv	(%ecx)
-
 	/* Remember the number of parameters for the exit handler since
 	   it has to remove them.  We store the number in the EBX register
 	   which the function we will call must preserve.  */