소스 검색

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 14 년 전
부모
커밋
f9a6372a98
1개의 변경된 파일4개의 추가작업 그리고 1개의 파일을 삭제
  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);
 }