Skip to content

Commit

Permalink
Hurd: Missing critical region locks.
Browse files Browse the repository at this point in the history
  • Loading branch information
sthibaul authored and frobtech committed May 10, 2012
1 parent ecd0de9 commit 802ca5a
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 3 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
2012-05-10 Samuel Thibault <[email protected]>

* 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.
Expand Down
2 changes: 2 additions & 0 deletions hurd/hurd/fd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -85,6 +86,7 @@ _hurd_fd_get (int fd)
}
}
__mutex_unlock (&_hurd_dtable_lock);
HURD_CRITICAL_END;

return descriptor;
}
Expand Down
5 changes: 4 additions & 1 deletion sysdeps/mach/hurd/dirfd.c
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand All @@ -35,6 +37,7 @@ dirfd (DIR *dirp)
fd = -1;
}
__mutex_unlock (&_hurd_dtable_lock);
HURD_CRITICAL_END;

return fd;
}
5 changes: 3 additions & 2 deletions sysdeps/mach/hurd/opendir.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 802ca5a

Please sign in to comment.