summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-07-25 06:39:40 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-07-25 06:39:40 +0900
commit0a63c4d5fbbbfae9aba92c78e39b1521b90f1b06 (patch)
tree4f7c8613455358cfb977c315ad030f8b24a44bdb
parentefa380b006aeafbad90b2d4e795a602404fec3c5 (diff)
Fix errno at seeking socket/pipe on Windows
[Bug #12230]
-rw-r--r--include/ruby/win32.h3
-rw-r--r--test/ruby/test_io.rb3
-rw-r--r--win32/win32.c11
3 files changed, 16 insertions, 1 deletions
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index fe1978fdde..b29470b0c4 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -146,7 +146,7 @@ typedef int clockid_t;
#define HAVE_UTIMENSAT 1
#define AT_FDCWD -100
#define utimensat(_d, _p, _t, _f) rb_w32_utimensat(_d, _p, _t, _f)
-#define lseek(_f, _o, _w) _lseeki64(_f, _o, _w)
+#define lseek(_f, _o, _w) rb_w32_lseek(_f, _o, _w)
#define pipe(p) rb_w32_pipe(p)
#define open rb_w32_open
@@ -751,6 +751,7 @@ int rb_w32_fclose(FILE*);
int rb_w32_pipe(int[2]);
ssize_t rb_w32_read(int, void *, size_t);
ssize_t rb_w32_write(int, const void *, size_t);
+off_t rb_w32_lseek(int, off_t, int);
int rb_w32_utime(const char *, const struct utimbuf *);
int rb_w32_uutime(const char *, const struct utimbuf *);
int rb_w32_utimes(const char *, const struct timeval *);
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 3c5dc7671a..0c81f4cb82 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -2240,6 +2240,9 @@ class TestIO < Test::Unit::TestCase
assert_raise(Errno::ENOENT, Errno::EINVAL) do
Class.new(IO).binread("|#{EnvUtil.rubybin} -e puts")
end
+ assert_raise(Errno::ESPIPE) do
+ IO.read("|echo foo", 1, 1)
+ end
end
def test_reopen
diff --git a/win32/win32.c b/win32/win32.c
index d28bd56452..825b42399c 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -5845,6 +5845,17 @@ rb_w32_lstati128(const char *path, struct stati128 *st)
return w32_stati128(path, st, filecp(), TRUE);
}
+off_t
+rb_w32_lseek(int fd, off_t ofs, int whence)
+{
+ SOCKET sock = TO_SOCKET(fd);
+ if (is_socket(sock) || is_pipe(sock)) {
+ errno = ESPIPE;
+ return -1;
+ }
+ return _lseeki64(fd, ofs, whence);
+}
+
/* License: Ruby's */
int
rb_w32_access(const char *path, int mode)