2001-07-31  Ulrich Drepper  <drepper@redhat.com>

	* libio/iopopen.c: Add lock for proc_file_chain access.
	Reported by Padraig Brady <Padraig@linux.ie>.
This commit is contained in:
Ulrich Drepper 2001-07-31 19:20:56 +00:00
parent 9f50867369
commit 34183f57d7
2 changed files with 32 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2001-07-31 Ulrich Drepper <drepper@redhat.com>
* libio/iopopen.c: Add lock for proc_file_chain access.
Reported by Padraig Brady <Padraig@linux.ie>.
2001-07-31 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/sparc/bits/poll.h (NPOLLFILE): Removed.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1993,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Per Bothner <bothner@cygnus.com>.
@ -108,6 +108,16 @@ static struct _IO_jump_t _IO_wproc_jumps;
static struct _IO_proc_file *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_new_proc_open (fp, command, mode)
_IO_FILE *fp;
@ -172,8 +182,16 @@ _IO_new_proc_open (fp, command, mode)
_IO_fileno (fp) = parent_end;
/* Link into 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 = proc_file_chain;
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_new_proc_close (fp)
int status = -1;
/* Unlink from 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_new_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;