diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-05-10 13:00:01 -0700 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2012-05-10 15:57:23 -0700 |
commit | 802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6 (patch) | |
tree | 76c6ff0b620ffd3354e30444a7a652082a8fa1e2 | |
parent | ecd0de9a955fd14e825a666ea6785842e1579326 (diff) | |
download | glibc-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.tar.gz glibc-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.tar.xz glibc-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.zip |
Hurd: Missing critical region locks.
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | hurd/hurd/fd.h | 2 | ||||
-rw-r--r-- | sysdeps/mach/hurd/dirfd.c | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/opendir.c | 5 |
4 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index 0d93e03af9..83afde7d03 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-05-10 Samuel Thibault <samuel.thibault@ens-lyon.org> + * hurd/hurd/fd.h (_hurd_fd_get): Call HURD_CRITICAL_BEGIN/ + HURD_CRITICAL_END around holding _hurd_dtable_lock. + * sysdeps/mach/hurd/dirfd (dirfd): Likewise. + * sysdeps/mach/hurd/opendir.c (_hurd_fd_opendir): Call + HURD_CRITICAL_BEGIN/HURD_CRITICAL_END around holding + d->port.lock. + * hurd/catch-signal.c (hurd_catch_signal): Use sigsetjmp/siglongjmp instead of setjmp/longjmp to restore the signal mask. Call sigsetjmp when handler == SIG_ERR, not when handler != SIG_ERR. diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index 5044f977fb..6a79738cb6 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -63,6 +63,7 @@ _hurd_fd_get (int fd) { struct hurd_fd *descriptor; + HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_dtable_lock); if (fd < 0 || fd >= _hurd_dtablesize) descriptor = NULL; @@ -85,6 +86,7 @@ _hurd_fd_get (int fd) } } __mutex_unlock (&_hurd_dtable_lock); + HURD_CRITICAL_END; return descriptor; } diff --git a/sysdeps/mach/hurd/dirfd.c b/sysdeps/mach/hurd/dirfd.c index 587ae7b2f1..42dbc78839 100644 --- a/sysdeps/mach/hurd/dirfd.c +++ b/sysdeps/mach/hurd/dirfd.c @@ -1,5 +1,5 @@ /* dirfd -- Return the file descriptor used by a DIR stream. Hurd version. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -25,6 +25,8 @@ int dirfd (DIR *dirp) { int fd; + + HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_dtable_lock); for (fd = 0; fd < _hurd_dtablesize; ++fd) if (_hurd_dtable[fd] == dirp->__fd) @@ -35,6 +37,7 @@ dirfd (DIR *dirp) fd = -1; } __mutex_unlock (&_hurd_dtable_lock); + HURD_CRITICAL_END; return fd; } diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index 217d4c85dd..c71cb18a65 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,5 +1,4 @@ -/* Copyright (C) 1993,1994,1995,1996,1997,1998,2001,2003,2005,2006 - Free Software Foundation, Inc. +/* Copyright (C) 1993-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,9 +49,11 @@ _hurd_fd_opendir (struct hurd_fd *d) return NULL; /* Set the descriptor to close on exec. */ + HURD_CRITICAL_BEGIN; __spin_lock (&d->port.lock); d->flags |= FD_CLOEXEC; __spin_unlock (&d->port.lock); + HURD_CRITICAL_END; dirp->__fd = d; dirp->__data = dirp->__ptr = NULL; |