fix handling of EINTR during close()
authorRich Felker <dalias@aerifal.cx>
Tue, 25 Sep 2012 02:39:08 +0000 (22:39 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 25 Sep 2012 02:39:08 +0000 (22:39 -0400)
austin group interpretation for defect #529
(http://austingroupbugs.net/view.php?id=529) tightens the
requirements on close such that, if it returns with EINTR, the file
descriptor must not be closed. the linux kernel developers vehemently
disagree with this, and will not change it. we catch and remap EINTR
to EINPROGRESS, which the standard allows close() to return when the
operation was not finished but the file descriptor has been closed.

src/unistd/close.c

index 728d729b02a06c9f3ea0307a20863525020ad28f..e8f813d648dfaac1a098defbaf91b388ebe640c4 100644 (file)
@@ -1,8 +1,11 @@
 #include <unistd.h>
+#include <errno.h>
 #include "syscall.h"
 #include "libc.h"
 
 int close(int fd)
 {
-       return syscall_cp(SYS_close, fd);
+       int r = __syscall_cp(SYS_close, fd);
+       if (r == -EINTR) r = -EINPROGRESS;
+       return __syscall_ret(r);
 }