From cd76457a8eec40a0de8cb2bc779c5bfb08b9d7b3 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 6 Jun 2010 07:19:55 +0000 Subject: ext: handle weird regular files with O_NONBLOCK set Sometimes programmers can blindly set O_NONBLOCK on everything in sight. However, O_NONBLOCK has no effect on regular files, so ignore it and allow the raw file descriptor to be used. --- ext/clogger_ext/clogger.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index 838f37c..834debe 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -260,7 +260,17 @@ static int raw_fd(VALUE my_fd) if (flags < 0) rb_sys_fail("fcntl"); - return (flags & O_NONBLOCK) ? -1 : fd; + if (flags & O_NONBLOCK) { + struct stat sb; + + if (fstat(fd, &sb) < 0) + return -1; + + /* O_NONBLOCK is no-op for regular files: */ + if (! S_ISREG(sb.st_mode)) + return -1; + } + return fd; #else /* platforms w/o fcntl/F_GETFL/O_NONBLOCK */ return -1; #endif /* platforms w/o fcntl/F_GETFL/O_NONBLOCK */ -- cgit v1.2.3-24-ge0c7