about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/mach/hurd/dup3.c7
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)