summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-15 23:17:23 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-26 09:45:06 +0900
commitdc13bd22bbdbde39332d30930f688205e6a2b4eb (patch)
tree85ed4d9c714d2c0dd80e78d9982f1efaeb8bc56e
parent292230cbf926e9892596ea37fd4567f0c49ab73c (diff)
Ignore failure on unsupported fcntl to drop non-blocking mode
Fixes https://github.com/ruby/ruby/pull/3723
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4000
-rw-r--r--ruby.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/ruby.c b/ruby.c
index fa65c16bd4..949b4b43f3 100644
--- a/ruby.c
+++ b/ruby.c
@@ -2214,6 +2214,26 @@ load_file_internal(VALUE argp_v)
return (VALUE)ast;
}
+/* disabling O_NONBLOCK, and returns 0 on success, otherwise errno */
+static inline int
+disable_nonblock(int fd)
+{
+#if defined(HAVE_FCNTL) && defined(F_SETFL)
+ if (fcntl(fd, F_SETFL, 0) < 0) {
+ const int e = errno;
+ ASSUME(e != 0);
+# if defined ENOTSUP
+ if (e == ENOTSUP) return 0;
+# endif
+# if defined B_UNSUPPORTED
+ if (e == B_UNSUPPORTED) return 0;
+# endif
+ return e;
+ }
+#endif
+ return 0;
+}
+
static VALUE
open_load_file(VALUE fname_v, int *xflag)
{
@@ -2263,18 +2283,10 @@ open_load_file(VALUE fname_v, int *xflag)
}
rb_update_max_fd(fd);
-#if defined HAVE_FCNTL && MODE_TO_LOAD != O_RDONLY
-# ifdef ENOTSUP
-# define IS_SUPPORTED_OP(e) ((e) != ENOTSUP)
-# else
-# define IS_SUPPORTED_OP(e) ((void)(e), 1)
-# endif
- /* disabling O_NONBLOCK */
- if (fcntl(fd, F_SETFL, 0) < 0 && IS_SUPPORTED_OP(e = errno)) {
+ if (MODE_TO_LOAD != O_RDONLY && (e = disable_nonblock(fd)) != 0) {
(void)close(fd);
rb_load_fail(fname_v, strerror(e));
}
-#endif
e = ruby_is_fd_loadable(fd);
if (!e) {