
「nul」という名称のRustパッケージ、Windowsユーザーに不具合を起こす 98
ストーリー by hylom
OSが変われば制約も変わる 部門より
OSが変われば制約も変わる 部門より
Rust言語のパッケージマネージャ「cargo」で、とある開発者が「nul」というパッケージを作成してリポジトリにアップロードしたところ、Windowsユーザーがパッケージの更新を行えなくなるという不具合が発生したそうだ(本の虫)。
Windowsでは、「nul」というファイル名は利用できないことになっている。これは、「nul」というファイル名はUNIX/Linuxで/dev/nullに相当するnullデバイス(「空のファイル」に相当)として使われているためだ。今回の問題は、「nul」というパッケージがリポジトリに追加されたため、Windows環境においてパッケージ情報の更新の際に「nul」というファイルを作成しようとするも、このファイル名を持つファイルの作成は禁止されているためエラーとなり、リポジトリ情報の更新が行えなくなるというもの。
これを受けて、Cargoリポジトリで「nul」や「con」、「prn」などのWindowsでは利用できないファイル名を持つパッケージ名の使用を禁止するという更新が行われている。
ぬるぬる (スコア:1)
file:///c|/con/con/con
Re:ぬるぬる (スコア:1)
懐かしい
似たような話 (スコア:1)
似たような話で、GnuTLSのリポジトリにコロンを含むファイルが追加されて、Windowsで取得できなくなってる。
https://gitlab.com/gnutls/gnutls/tree/master/tests/suite/certs-coverage [gitlab.com]
似たような問題で win32 の 256 文字制限ではまりました (スコア:2)
一応,ここにつなげて書くかな.
Linux/Mac で作業していた時に,手元の git リポジトリに何気に深ーいパスのファイル名を追加.
Windows 環境で作業しようと,git pull したら取り出すときに訳の分からないエラー.
調べてみたら git client が 32bit アプリだったせいで,win32 環境の 256 文字制限にひかっかったというわけ.
git クライアントを差し替えてみたけど,次から次にいろんな 32bit アプリが引っかかってダメダメ.
結局,開発環境全体を 64bit にすることができずに,Windows 環境での開発はあきらめました.
...ということを数か月間に経験したばかり.
Re:似たような問題で win32 の 256 文字制限ではまりました (スコア:3, 参考になる)
それ、単に32/64bit関係なくアプリが対応してないだけです。
単純に64bit化しても255文字を超えるパスには対応出来ませんし、32bitアプリでもAPI的には\\?\接頭語を付けてAPIを呼べば3万文字は扱えます。
# #3209924 [srad.jp]のリンク先とか、手前味噌でアレですが、去年の私の投稿 [srad.jp](ファイル名に予約語を使って削除も回避するマルウェアのストーリー [security.srad.jp]コメント)とか参考にどうぞ。
ちゃんと実装してれば今回話題のnulというフォルダやファイルも作成できます。
ただし、\\?\が付く・付けることによるロジックや仕様面でのスペシャル対応が必要なので対応してないアプリの方が多いです。
エクスプローラーとかも対応してませんので、後で扱いで困る事もありますしね。
C直下にTempフォルダを用意してコマンドプロンプトで下記コマンドを実行するとnulファイルが作成される事が確認できるかと。
ちなみに出来の悪いフィルタドライバやシェル拡張等が居ると何が起きるか解らないので自己責任でお願いします。
# 過去アンチウィルスソフトのフィルタドライバがBSoDを起こす等色々有りましたので。
copy nul "\\?\C:\Temp\nul"
Re:似たような問題で win32 の 256 文字制限ではまりました (スコア:2)
X:¥某組織の¥なんとか部署の¥なんとか課の¥何年の¥何月の¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果1¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果.xlsx
みたいな長いパスってたまにやらかすよねぇ・・・
NASから別のNASにコピーしようとしてパスが長すぎでエラーとか。
**たこさん**・・・
Re:似たような問題で win32 の 256 文字制限ではまりました (スコア:1)
エクスプローラーが長いパスにうっかり対応しちゃうとそれはそれで互換性に伴う頭痛の種が。
サードパーティーの例えばAdobeのPDFサムネイルプレビューとかアンチウィルスとか様々なシェル拡張アプリケーションが全て正しく実装してないと、
エクスプローラー(含むスタートメニュー等)自体がクラッシュするとか任意コード実行されるという酷い状態になるのです。
# 森鷗外𠮟るというUnicodeやサロゲートペア入りパスですら怪しいというのにBoFに直結するようなファイル長対応は何時来るのやら
盲腸 (スコア:0)
Windows3.1の時代なら納得出来ただろうが、DOSも消えたというのにこんな盲腸みたいなものが残ってるのは不思議で不可解
#errとかcomとかも駄目かな?
Re: (スコア:0)
盲腸っつーか後方互換性でしょ
.comも.scrも実行ファイル扱いだしそんなもんよ
# 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う
Re: (スコア:0)
># 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う
null(L二個)ならともかく、nul(L一個)でそんなこと言われてもなあ。
Re:盲腸 (スコア:2)
フランス語とかnulは日常で使う単語なんですけどね。
Re:盲腸 (スコア:2)
一応補足しておくと"nul"という完全一致の語をフランス語では頻繁に使用する、という意味です。
Re: (スコア:0)
まあ、何時までそれ残すんだよ!ってのはあるね。
でも、それよりは"/"がファイル名に使えないのにイラっとされる事が多い。
1/6~6/6みたいに付けたいと。
表示可能文字&文字列全てokならこんな事にはならんだろうが、階層表現が。。。
Re:盲腸 (スコア:1)
>1/6~6/6みたいに付けたいと。
それは絶対にやめてほしい。
samba使ってると非常に厳しそう
Re: (スコア:0)
それよりは空白文字がファイル名に使えてしまうのにイラっとする。
お宝画像.jpg .exe
を踏んでしまうから、というのは冗談で、
コマンドライン引数にするのにいちいち二重引用符で囲わなければいけないから。
Re:盲腸 (スコア:1)
Windowsだけで閉じている環境でなければ、空白文字も全角文字もファイルパスに使うのは避けてほしいと願ってしまう。
Re: (スコア:0)
保存用にprnフォルダを作ろうとして失敗するんですね。
Re: (スコア:0)
/はそもそも\(バックスラッシュ)と同じパス区切りの文字だからね。
と言うかUNIXに合わせて/もパス区切りにしてあるんじゃなかったっけ?
Re: (スコア:0)
シングルバイト文字圏だとパスの区切りはウィンドウズでも/だった気がする。日本語版だと\だがShift_JISの\はユニコードなんかだと/が割り当ててあったりしたきもする
Re: (スコア:0)
いやいやシングルバイトでもバックスラッシュですよ。
APIレベルだと/もバックスラッシュと同様に使えるだけです。
Re: (スコア:0)
Re: (スコア:0)
>> /はコマンドスイッチで、パス区切りはバックスラッシュ
こんなアホな突っ込みを入れてる時点で知らんのだろうけど。
/がコマンドスイッチなのはcommand.com(DOS)の仕様で
-にも変更できる。
そしてAPIレベルではには/はパス区切りとして使用できる。
MS-DOSの時代からね(当然Windowsでも)。
Re: (スコア:0)
https://msdn.microsoft.com/ja-jp/library/77859s1t(v=vs.90).aspx [microsoft.com]
UNIX ではパス デリミタとしてスラッシュ (/) しか使用できませんが、Win32 オペレーティング システムは円記号 (\) とスラッシュ (/) の両方を使用できます。
Re: (スコア:0)
そのINT 2FHなAPIってUndocumentedじゃないでしたっけ?
Re:盲腸 (スコア:1)
> /がコマンドスイッチなのはcommand.com(DOS)の仕様で
> -にも変更できる。
変更できましたが、止めた方が良い。
全てのコマンドが対応している訳ではないし、トラブルの元。
PowerShell使ったら、もっと分からなくなった。
> そしてAPIレベルではには/はパス区切りとして使用できる。
今もそうなのだろうか?
Re:盲腸 (スコア:1)
一杯書いてあるが、、、、肝心な事が落ちていないか? 見落としか?
なぜ、/ がパスの区切りにならなかったか?
もともと、DOSには、パスの概念が無く、パラメータの区切りとして、"/" を使っていた。
# コマンドとパラメータの間の空白は必要無い。
その後、パスの概念が入ったが、既に "/" が使われていたので、"\"(ascii ではバックスラッシュ) を使ったと聞きます。
知ってる人、少ないようですが。
Re: (スコア:0)
># 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う
null(L二個)ならともかく、nul(L一個)でそんなこと言われてもなあ。
俗に言うASCIIコードの定義とかだと0x00の名称はNULなんで、言語レベルの予約語になってることは少ないにせよ、紛らわしい名前は使うべきじゃないと思う
Re: (スコア:0)
半角カナの「デスクトップ」フォルダに作ったファイルが、
UNIX環境に持っていって不具合起こしたのはいい思い出。
#誰だよ、ディレクトリ名に「デスクトップ」なんて付けた奴は。「desktop」でいいじゃん
Re:盲腸 (スコア:1)
現行の Windows では Desktop ですね。
むしろ、今は freedesktop.org 準拠のデスクトップ環境がホームに日本語ディレクトリを作ろうとする。
Re: (スコア:0)
Re: (スコア:0)
Windowsだと下手すると「desk top」を使う奴いるかもしれんからな
#お願いだから「desktop」がどうしても嫌なら「desk_top」にして
Re: (スコア:0)
わかったぞと言いながら disktop にするオジサン……
Re: (スコア:0)
そこはむしろdesukutoppuだろう
Re: (スコア:0)
ええっ?
NULでも/dev/nullでもいいけど、ビットバケツって絶対必要だと思うんだけどなぁ。。。
盲腸扱いって斬新すぎて目からうろこが剥がれ落ちそうで落ちない
うろこがないから。
Re: (スコア:0)
\\.\Device\Null に書き込めるようにすればいいんだけどなそんなのは
Re: (スコア:0)
本当はNTFS廃止でそこらへんの後方互換性もばっさり来られる予定だったんですけどねぇ。
Re:盲腸 (スコア:1)
すごい (スコア:0)
10年以上windows使ってるけど初めて知ったわ
拡張子ついててもダメなんだな
Re:すごい (スコア:1)
>10年以上windows使ってるけど初めて知ったわ
古参ぶった発言だけど、よく考えりゃ2007年近辺からってことだよな
つい最近じゃねーか@(ジャネーノ法則による年寄りの年代log scale誤認識)
Re:すごい (スコア:2)
これなら、よくやりました。
Re: (スコア:0)
MS-DOS 2.0 で階層ディレクトリがサポートされたが、デバイスファイルは、互換性として階層なしのファイル名だけで操作できるままになった。
現代まで、その部分の互換を引き続いてる。
機能は追加されたが削除されてないので、当時のバッチファイルが今でも動くのは、すごいことだけど、本当に必要なのかは疑問もあるな。
Re:すごい (スコア:1)
もしかしてと思ったが、
windows10のコマンドプロンプトで、
> dir/w
としたら、動いた。 "/"がスイッチキャラクタとして認識されて、
コマンドと分離されている。 ( "dir" と "/w" の間にスペース無し)
ここで、スイッチキャラクタを "-" に変更すると、"-"のあるファイルが正しく認識されない筈。(隠しコマンドが有効なら)
Re: (スコア:0)
古いWindowsのソフトは動かなかったりするのに
そんな盲腸みたいな部分の互換性は残ってるという……
Re:すごい (スコア:1)
ほかにも、コンソール入力・出力のCONIN$とCONOUT$なんかもあります: CreateFile function (Windows) [microsoft.com]。厳密には、予約済みファイル名とは異なる扱いなのかもしれませんが、実用上はCON~LPT9と同じ予約済みファイル名として扱うのが良いと思います。
Re: (スコア:0)
>>機能は追加されたが削除されてないので、当時のバッチファイルが今でも動くのは、すごいことだけど、本当に必要なのかは疑問もあるな。
実は最近、昔のバッチがそのまま動かない事態に遭遇して難儀したことがある
少しづつバッチ(DOS窓)の機能が追加・改良されて、逆に微妙に互換性が失われてる部分もあるんだよね
#command/c なんて昔話なんだぁ.......
Re:すごい (スコア:1)
32bitだったら、MS-DOSのプログラムがそのまま、動く事もある。
まあ、実用的アプリがそのまま、動くとは言わないが、
片手間に作った、ツール類が動く程度の互換性。
凄いといえば、凄いが、その一方で、無理があるんだろうな、、と。
Re: (スコア:0)
これだね
What’s the deal with those reserved filenames like NUL and CON? [microsoft.com]
Re: (スコア:0)
20年使ってても知らないで済むことかもしれない
Re:すごい (スコア:1)
Unixはナルええの世界だから… (スコア:0)
言ってみただけ。