[ruby-dev:45228] [Backport93 - Backport #5429] 64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合

From: Makoto Kishimoto <redmine@...>
Date: 2012-02-10 07:45:57 UTC
List: ruby-dev #45228
Issue #5429 has been updated by Makoto Kishimoto.


とりあえず今気づきましたというACKだけ。
特に何か「これは困る」というものではないので、
1.9.3へのバックポートは、なしで、私はかまいません。

trunkで問題が起きないことを確認すればいいんですよね?
(さて問題のスクリプトはハードディスクのどこだっけ……)
----------------------------------------
Backport #5429: 64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合
https://bugs.ruby-lang.org/issues/5429

Author: Makoto Kishimoto
Status: Assigned
Priority: Normal
Assignee: Makoto Kishimoto
Category: 
Target version: 


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の受け入れるべき引数の値の範囲の
問題などがあるので、とりあえずチケットのみ登録します。


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

In This Thread