Issue #6127 has been updated by h.shirosaki (Hiroshi Shirosaki).


I have a build error of ruby_1_9_3 branch at r37146 with mingw.
It seems due to r37138.

compiling ../io.c
../io.c: In function 'rb_cloexec_fcntl_dupfd':
../io.c:213:21: error: 'F_DUPFD' undeclared (first use in this function)
../io.c:213:21: note: each undeclared identifier is reported only once for each function it appears in
../io.c: In function 'rb_io_each_byte':
../io.c:3081:15: warning: variable 'e' set but not used [-Wunused-but-set-variable]
../io.c: In function 'rb_io_advise':
../io.c:7892:16: warning: variable 'l' set but not used [-Wunused-but-set-variable]
../io.c:7892:11: warning: variable 'off' set but not used [-Wunused-but-set-variable]
../io.c: At top level:
../io.c:1575:14: warning: 'nogvl_fsync' defined but not used [-Wunused-function]
make: *** [io.o] Error 1


Here is a patch.

Index: io.c
===================================================================
--- io.c	(revision 37146)
+++ io.c	(working copy)
@@ -209,8 +209,10 @@
     else {
       ret = fcntl(fd, F_DUPFD, minfd);
     }
+#elif defined(F_DUPFD)
+    ret = fcntl(fd, F_DUPFD, minfd);
 #else
-    ret = fcntl(fd, F_DUPFD, minfd);
+    ret = -1;
 #endif
     if (ret == -1) return -1;
     rb_maygvl_fd_fix_cloexec(ret);

----------------------------------------
Backport #6127: IO#ioctl range error in 1.9.3
https://bugs.ruby-lang.org/issues/6127#change-30360

Author: dlampa (Donovan Lampa)
Status: Closed
Priority: Normal
Assignee: naruse (Yui NARUSE)
Category: 
Target version: 


In 32-bit implementations of 1.9.3 passing an (apparently) unsigned value (BIOCIMMEDIATE = 0x80044270) to ioctl throws range error:

ruby-1.9.3-p125 :001 > a,b = IO.pipe
 => [#<IO:fd 5>, #<IO:fd 6>]
ruby-1.9.3-p125 :002 > a.ioctl(0x80044270, "\x01")
RangeError: bignum too big to convert into `long'
  from (irb):2:in `ioctl'
  from (irb):2
  from /Users/dlampa/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'
ruby-1.9.3-p125 :001 > 0x80044270.class
 => Bignum

When in 32-bit 1.9.1 and 1.9.2 it does not:

ruby-1.9.1-p243 :001 > a,b = IO.pipe
 => [#<IO:0x202fefc>, #<IO:0x202fec4>]
ruby-1.9.1-p243 :002 > a.ioctl(0x80044270, "\x01")
Errno::ENOTTY: Inappropriate ioctl for device
  from (irb):2:in `ioctl'
  from (irb):2
  from /Users/dlampa/.rvm/rubies/ruby-1.9.1-p243/bin/irb:16:in `<main>'
ruby-1.9.1-p243 :001 > 0x80044270.class
 => Bignum

OS is [x86_64-darwin10.8.0] however ruby was compiled as 32-bit through rvm using:
rvm_archflags="-arch i386" CFLAGS="-arch i386" LDFLAGS="-arch i386" rvm install [ruby-version] --patch osx-arch-fix

The patch is installed in ~/.rvm/patches/ruby/1.9.3/ and is as follows:

--- a/Makefile.in       2010-11-11 15:54:26.000000000 -0600
+++ b/Makefile.in       2010-11-11 15:55:24.000000000 -0600
@@ -55,7 +55,7 @@ XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
 EXTLIBS = 
 LIBS = @LIBS@ $(EXTLIBS)
 MISSING = @LIBOBJS@ @ALLOCA@
-LDSHARED = @LIBRUBY_LDSHARED@
+LDSHARED = @LIBRUBY_LDSHARED@ $(LDFLAGS)
 DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@
 SOLIBS = @SOLIBS@
 MAINLIBS = @MAINLIBS@

this issue appears to be related (http://bugs.ruby-lang.org/issues/5429), but I don't speak Japanese.


-- 
http://bugs.ruby-lang.org/