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>
-/* 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>.
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;
_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;
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)
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;
+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.
#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;
}
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)
{
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)
{
{
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];
__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. */
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. */
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. */