Project

General

Profile

Actions

Bug #6427

closed

ruby ioctl: Error integer 2148012656 too big to convert to `int'

Added by hadmut (Hadmut Danisch) over 12 years ago. Updated over 12 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
Backport:
[ruby-core:45009]

Description

Hi,

the upgrade to ubuntu 12.04 came with an upgrade to ruby 1.9.3.
Unfortunately, in recent 1.9.3 versions of ruby there's a bug in the
ioctl function. E.g. if you want to do getbsz() on a block device and do
a

f.ioctl(0x80081270,a)

you'll get the error message

Error integer 2148012656 too big to convert to `int'
RangeError

(2148012656 = 0x80081270)

So ruby can't do ioctl's anymore if the highest bit is set in the ioctl code.

This was working code in ruby 1.9.2 / ubuntu 11.10.

regards


Related issues 1 (0 open1 closed)

Is duplicate of Ruby master - Bug #5429: 64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合Closedmetanest (Makoto Kishimoto)10/10/2011Actions

Updated by shyouhei (Shyouhei Urabe) over 12 years ago

  • Status changed from Open to Rejected

Both ruby and glibc header file (and Ubuntu's manpage of ioctl(2)) agree that
ioctl takes int, and 2148012656 is greater than INT_MAX. Hence the exception.

You have to use -2146954640 instead.

Updated by naruse (Yui NARUSE) over 12 years ago

shyouhei (Shyouhei Urabe) wrote:

Both ruby and glibc header file (and Ubuntu's manpage of ioctl(2)) agree that
ioctl takes int, and 2148012656 is greater than INT_MAX. Hence the exception.

You have to use -2146954640 instead.

The manpage of ioctl(2) says that the type of its 2nd argument is int, but it is a lie.
The prototype of ioctl(2) in /usr/include/sys/ioctl.h says it is unsigned int.
extern int ioctl (int __fd, unsigned long int __request, ...) __THROW;

Bug #5429 is the issue and it says:

  • Free Unix uses unsigned int
  • Commercial Unix uses int

This issue is fixed in trunk but not backported to 1.9.3 yet.

Updated by shyouhei (Shyouhei Urabe) over 12 years ago

Oh, I didn't know that. Thank you to point that out.

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

On Sat, May 12, 2012 at 11:23 AM, naruse (Yui NARUSE) wrote:

Issue #6427 has been updated by naruse (Yui NARUSE).

shyouhei (Shyouhei Urabe) wrote:

Both ruby and glibc header file (and Ubuntu's manpage of ioctl(2)) agree that
ioctl takes int, and 2148012656 is greater than INT_MAX.  Hence the exception.

You have to use -2146954640 instead.

The manpage of ioctl(2) says that the type of its 2nd argument is int, but it is a lie.
The prototype of ioctl(2) in /usr/include/sys/ioctl.h says it is unsigned int.
extern int ioctl (int __fd, unsigned long int __request, ...) __THROW;

Bug #5429 is the issue and it says:

  • Free Unix uses unsigned int
  • Commercial Unix uses int

This issue is fixed in trunk but not backported to 1.9.3 yet.

btw, Linux community plan to fix man pages too.

https://bugzilla.kernel.org/show_bug.cgi?id=42705

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0