Project

General

Profile

Actions

Bug #5429

closed

64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合

Added by metanest (Makoto Kishimoto) about 13 years ago. Updated about 11 years ago.

Status:
Closed
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:44589]

Description

64ビットなFreeBSD 8において、ioctl(2)のプロトタイプ宣言は以下のように
なっていて、

int
ioctl(int d, unsigned long request, ...);

ビット31(32ビットであればMSB)が1なリクエストでも、上位ビットがゼロ拡張
された64ビット値を期待しています。

それに対しrubyのtrunkではIO#ioctlの引数の値の範囲は符号付き32ビットに
なっていて、最終的にio.cのnogvl_io_cntlに、intを引数としたioctlの
呼び出しがあり、ビット31が1なリクエストは符号拡張されて、ioctlを呼ぶことに
なり、

その結果システムメッセージに、(SNDCTL_DSP_SPEED の例)
WARNING pid 82043 (initial thread): ioctl sign-extension ioctl ffffffffc0045002
というようなウォーニングが出ます(一応目的の動作はしている)。

回避する修正は (unsigned) とキャストを入れればいいように思うのですが、
他のプラットフォームでの問題や、IO#ioctlの受け入れるべき引数の値の範囲の
問題などがあるので、とりあえずチケットのみ登録します。


Related issues 2 (0 open2 closed)

Related to Backport193 - Backport #6127: IO#ioctl range error in 1.9.3Closednaruse (Yui NARUSE)03/10/2012Actions
Has duplicate Ruby master - Bug #6427: ruby ioctl: Error integer 2148012656 too big to convert to `int'Rejected05/12/2012Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0