aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-05-10 13:00:01 -0700
committerRoland McGrath <roland@hack.frob.com>2012-05-10 15:57:23 -0700
commit802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6 (patch)
tree76c6ff0b620ffd3354e30444a7a652082a8fa1e2
parentecd0de9a955fd14e825a666ea6785842e1579326 (diff)
downloadtermbaud-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.tar.gz
termbaud-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.tar.xz
termbaud-802ca5a5efa5d11836b2ffd81c9f6fd42f938ac6.zip
Hurd: Missing critical region locks.
-rw-r--r--ChangeLog7
-rw-r--r--hurd/hurd/fd.h2
-rw-r--r--sysdeps/mach/hurd/dirfd.c5
-rw-r--r--sysdeps/mach/hurd/opendir.c5
4 files changed, 16 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d93e03af9d..83afde7d032 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 5044f977fb5..6a79738cb60 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 587ae7b2f15..42dbc78839b 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 217d4c85dd2..c71cb18a658 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;