Update.
* 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/oldiopopen.c: Add lock for old_proc_file_chain access.
This commit is contained in:
parent
34183f57d7
commit
ad71126b24
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue