* login/login_tty.c (login_tty): The Linux kernel can return EBUSY
authorUlrich Drepper <drepper@redhat.com>
Thu, 4 Oct 2007 21:54:22 +0000 (21:54 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 4 Oct 2007 21:54:22 +0000 (21:54 +0000)
for dup2 in case another thread races with the current one.  Retry
in this case.

ChangeLog
login/login_tty.c

index e4ad3c8..eed866f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2007-10-04  Ulrich Drepper  <drepper@redhat.com>
 
+       * login/login_tty.c (login_tty): The Linux kernel can return EBUSY
+       for dup2 in case another thread races with the current one.  Retry
+       in this case.
+
        * misc/error.h: Remove support for use outside of libc.  We have to
        include <features.h> now.  Include <bits/error.h> if possible.
        * misc/bits/error.h: New file.
index 1bb1703..2ba276d 100644 (file)
@@ -31,6 +31,7 @@
 static char sccsid[] = "@(#)login_tty.c        8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
 
+#include <errno.h>
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
@@ -63,9 +64,12 @@ login_tty(fd)
            }
        }
 #endif
-       (void) dup2(fd, 0);
-       (void) dup2(fd, 1);
-       (void) dup2(fd, 2);
+       while (dup2(fd, 0) == -1 && errno == EBUSY)
+         ;
+       while (dup2(fd, 1) == -1 && errno == EBUSY)
+         ;
+       while (dup2(fd, 2) == -1 && errno == EBUSY)
+         ;
        if (fd > 2)
                (void) close(fd);
        return (0);