[ruby-dev:47810] [ruby-trunk - Bug #5429] 64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合
From:
"naruse (Yui NARUSE)" <naruse@...>
Date:
2013-11-19 01:46:15 UTC
List:
ruby-dev #47810
Issue #5429 has been updated by naruse (Yui NARUSE). ruby -v set to - メモ: Linux の ioctl の manpage がなおったらしい Linux's bug http://mkosaki.blog46.fc2.com/blog-entry-1246.html ---------------------------------------- Bug #5429: 64ビットなFreeBSDのioctlでビット31が1なリクエストの時の不具合 https://bugs.ruby-lang.org/issues/5429#change-43013 Author: metanest (Makoto Kishimoto) Status: Closed Priority: Normal Assignee: metanest (Makoto Kishimoto) Category: Target version: ruby -v: - Backport: 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/