diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/mach/hurd/dup3.c | 7 |
2 files changed, 9 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 805adedc22..d2174fe270 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-05-10 Samuel Thibault <samuel.thibault@ens-lyon.org> + + * sysdeps/mach/hurd/dup3.c: Lock _hurd_dtable_lock before + checking for _hurd_dtablesize. Unlock it right after having + finished _hurd_dtable allocation. + 2012-05-10 Thomas Schwinge <thomas@schwinge.name> * sysdeps/mach/hurd/configure.in: Remove warning for --prefix=[...]. diff --git a/sysdeps/mach/hurd/dup3.c b/sysdeps/mach/hurd/dup3.c index 8a38caf080..523ca42285 100644 --- a/sysdeps/mach/hurd/dup3.c +++ b/sysdeps/mach/hurd/dup3.c @@ -71,15 +71,14 @@ __dup3 (int fd, int fd2, int flags) /* Get a hold of the destination descriptor. */ struct hurd_fd *d2; + __mutex_lock (&_hurd_dtable_lock); + if (fd2 >= _hurd_dtablesize) { /* The table is not large enough to hold the destination descriptor. Enlarge it as necessary to allocate this descriptor. */ __mutex_unlock (&_hurd_dtable_lock); - /* We still hold FD1's lock, but this is safe because - _hurd_alloc_fd will only examine the cells starting - at FD2. */ d2 = _hurd_alloc_fd (NULL, fd2); if (d2) __spin_unlock (&d2->port.lock); @@ -99,6 +98,7 @@ __dup3 (int fd, int fd2, int flags) MACH_PORT_NULL); } } + __mutex_unlock (&_hurd_dtable_lock); if (d2 == NULL) { @@ -126,7 +126,6 @@ __dup3 (int fd, int fd2, int flags) _hurd_port_locked_set (&d2->port, port); /* Unlocks D2. */ } } - __mutex_unlock (&_hurd_dtable_lock); _hurd_port_free (&d->port, &ulink, port); if (ctty != MACH_PORT_NULL) |