Use O_CLOEXEC instead of fcntl(FD_CLOEXEC) O_CLOEXEC avoids a race condition and is less code. It was supported in Linux starting 2.6.23. https://bugs.python.org/issue26343#msg260151 says it's been available since macOS 10.7. Let's try using it instead of fcntl and see if anything breaks. It's even part of POSIX these days. Update-Note: BoringSSL's /dev/urandom code now assumes the platform supports O_CLOEXEC. Change-Id: I95313892b36539591685d4c83a387f77129ad3d1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/54125 Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/fipsmodule/rand/urandom.c b/crypto/fipsmodule/rand/urandom.c index 508d441..11f1b5b 100644 --- a/crypto/fipsmodule/rand/urandom.c +++ b/crypto/fipsmodule/rand/urandom.c
@@ -198,7 +198,7 @@ int fd; do { - fd = open("/dev/urandom", O_RDONLY); + fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); } while (fd == -1 && errno == EINTR); if (fd < 0) { @@ -206,20 +206,6 @@ abort(); } - int flags = fcntl(fd, F_GETFD); - if (flags == -1) { - // Native Client doesn't implement |fcntl|. - if (errno != ENOSYS) { - perror("failed to get flags from urandom fd"); - abort(); - } - } else { - flags |= FD_CLOEXEC; - if (fcntl(fd, F_SETFD, flags) == -1) { - perror("failed to set FD_CLOEXEC on urandom fd"); - abort(); - } - } *urandom_fd_bss_get() = fd; }