Explorar el Código

workaround bug in linux dup2

the linux documentation for dup2 says it can fail with EBUSY due to a
race condition with open and dup in the kernel. shield applications
(and the rest of libc) from this nonsense by looping until it succeeds
Rich Felker hace 14 años
padre
commit
f9a6372a98
Se han modificado 1 ficheros con 4 adiciones y 1 borrados
  1. 4 1
      src/unistd/dup2.c

+ 4 - 1
src/unistd/dup2.c

@@ -1,7 +1,10 @@
 #include <unistd.h>
+#include <errno.h>
 #include "syscall.h"
 
 int dup2(int old, int new)
 {
-	return syscall(SYS_dup2, old, new);
+	int r;
+	while ((r=__syscall(SYS_dup2, old, new))==-EBUSY);
+	return __syscall_ret(r);
 }