パスワードを忘れた? アカウント作成
13278933 story
Windows

「nul」という名称のRustパッケージ、Windowsユーザーに不具合を起こす 98

ストーリー by hylom
OSが変われば制約も変わる 部門より

Rust言語のパッケージマネージャ「cargo」で、とある開発者が「nul」というパッケージを作成してリポジトリにアップロードしたところ、Windowsユーザーがパッケージの更新を行えなくなるという不具合が発生したそうだ(本の虫)。

Windowsでは、「nul」というファイル名は利用できないことになっている。これは、「nul」というファイル名はUNIX/Linuxで/dev/nullに相当するnullデバイス(「空のファイル」に相当)として使われているためだ。今回の問題は、「nul」というパッケージがリポジトリに追加されたため、Windows環境においてパッケージ情報の更新の際に「nul」というファイルを作成しようとするも、このファイル名を持つファイルの作成は禁止されているためエラーとなり、リポジトリ情報の更新が行えなくなるというもの。

これを受けて、Cargoリポジトリで「nul」や「con」、「prn」などのWindowsでは利用できないファイル名を持つパッケージ名の使用を禁止するという更新が行われている。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2017年05月12日 18時02分 (#3209792)

    file:///c|/con/con/con

  • by Anonymous Coward on 2017年05月12日 21時44分 (#3209905)

    似たような話で、GnuTLSのリポジトリにコロンを含むファイルが追加されて、Windowsで取得できなくなってる。
    https://gitlab.com/gnutls/gnutls/tree/master/tests/suite/certs-coverage [gitlab.com]

    • 一応,ここにつなげて書くかな.

      Linux/Mac で作業していた時に,手元の git リポジトリに何気に深ーいパスのファイル名を追加.
      Windows 環境で作業しようと,git pull したら取り出すときに訳の分からないエラー.
      調べてみたら git client が 32bit アプリだったせいで,win32 環境の 256 文字制限にひかっかったというわけ.
      git クライアントを差し替えてみたけど,次から次にいろんな 32bit アプリが引っかかってダメダメ.
      結局,開発環境全体を 64bit にすることができずに,Windows 環境での開発はあきらめました.

      ...ということを数か月間に経験したばかり.

      親コメント
      • それ、単に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"

        親コメント
        • X:¥某組織の¥なんとか部署の¥なんとか課の¥何年の¥何月の¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果1¥なんちゃらかんちゃらのどうとかに関するアンケートの集計結果.xlsx
          みたいな長いパスってたまにやらかすよねぇ・・・
          NASから別のNASにコピーしようとしてパスが長すぎでエラーとか。

          --
          **たこさん**・・・
          親コメント
  • by Anonymous Coward on 2017年05月12日 17時55分 (#3209787)

    Windows3.1の時代なら納得出来ただろうが、DOSも消えたというのにこんな盲腸みたいなものが残ってるのは不思議で不可解
    #errとかcomとかも駄目かな?

    • by Anonymous Coward

      盲腸っつーか後方互換性でしょ
      .comも.scrも実行ファイル扱いだしそんなもんよ

      # 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う

      • by Anonymous Coward

        ># 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う

        null(L二個)ならともかく、nul(L一個)でそんなこと言われてもなあ。

        • by StandardIO (47182) on 2017年05月13日 9時24分 (#3210048) 日記

          フランス語とかnulは日常で使う単語なんですけどね。

          親コメント
        • by Anonymous Coward

          まあ、何時までそれ残すんだよ!ってのはあるね。

          でも、それよりは"/"がファイル名に使えないのにイラっとされる事が多い。
          1/6~6/6みたいに付けたいと。

          表示可能文字&文字列全てokならこんな事にはならんだろうが、階層表現が。。。

          • by nemui4 (20313) on 2017年05月12日 20時06分 (#3209859) 日記

            >1/6~6/6みたいに付けたいと。

            それは絶対にやめてほしい。
            samba使ってると非常に厳しそう

            親コメント
          • by Anonymous Coward

            それよりは空白文字がファイル名に使えてしまうのにイラっとする。

            お宝画像.jpg                            .exe

            を踏んでしまうから、というのは冗談で、
            コマンドライン引数にするのにいちいち二重引用符で囲わなければいけないから。

            • by nemui4 (20313) on 2017年05月12日 20時08分 (#3209861) 日記

              Windowsだけで閉じている環境でなければ、空白文字も全角文字もファイルパスに使うのは避けてほしいと願ってしまう。

              親コメント
            • by Anonymous Coward

              保存用にprnフォルダを作ろうとして失敗するんですね。

          • by Anonymous Coward

            /はそもそも\(バックスラッシュ)と同じパス区切りの文字だからね。

            と言うかUNIXに合わせて/もパス区切りにしてあるんじゃなかったっけ?

            • by Anonymous Coward

              シングルバイト文字圏だとパスの区切りはウィンドウズでも/だった気がする。日本語版だと\だがShift_JISの\はユニコードなんかだと/が割り当ててあったりしたきもする

              • by Anonymous Coward

                いやいやシングルバイトでもバックスラッシュですよ。
                APIレベルだと/もバックスラッシュと同様に使えるだけです。

            • by Anonymous Coward
              /はコマンドスイッチで、パス区切りはバックスラッシュ
              • by Anonymous Coward

                >> /はコマンドスイッチで、パス区切りはバックスラッシュ

                こんなアホな突っ込みを入れてる時点で知らんのだろうけど。
                /がコマンドスイッチなのはcommand.com(DOS)の仕様で
                -にも変更できる。

                そしてAPIレベルではには/はパス区切りとして使用できる。
                MS-DOSの時代からね(当然Windowsでも)。

              • by Anonymous Coward

                https://msdn.microsoft.com/ja-jp/library/77859s1t(v=vs.90).aspx [microsoft.com]

                UNIX ではパス デリミタとしてスラッシュ (/) しか使用できませんが、Win32 オペレーティング システムは円記号 (\) とスラッシュ (/) の両方を使用できます。

              • by Anonymous Coward

                そのINT 2FHなAPIってUndocumentedじゃないでしたっけ?

              • by wood377 (46309) on 2017年05月13日 18時55分 (#3210250) 日記

                > /がコマンドスイッチなのはcommand.com(DOS)の仕様で
                > -にも変更できる。
                変更できましたが、止めた方が良い。
                全てのコマンドが対応している訳ではないし、トラブルの元。

                PowerShell使ったら、もっと分からなくなった。

                > そしてAPIレベルではには/はパス区切りとして使用できる。
                今もそうなのだろうか?

                親コメント
              • by wood377 (46309) on 2017年05月13日 19時03分 (#3210251) 日記

                一杯書いてあるが、、、、肝心な事が落ちていないか? 見落としか?

                なぜ、/ がパスの区切りにならなかったか?

                もともと、DOSには、パスの概念が無く、パラメータの区切りとして、"/" を使っていた。
                # コマンドとパラメータの間の空白は必要無い。
                その後、パスの概念が入ったが、既に "/" が使われていたので、"\"(ascii ではバックスラッシュ) を使ったと聞きます。

                知ってる人、少ないようですが。

                親コメント
        • by Anonymous Coward

          ># 他OSで滅多に使われない単語なら兎も角、nulは流石に使う方がプログラマーとして駄目だろって思う

          null(L二個)ならともかく、nul(L一個)でそんなこと言われてもなあ。

          俗に言うASCIIコードの定義とかだと0x00の名称はNULなんで、言語レベルの予約語になってることは少ないにせよ、紛らわしい名前は使うべきじゃないと思う

    • by Anonymous Coward

      半角カナの「デスクトップ」フォルダに作ったファイルが、
      UNIX環境に持っていって不具合起こしたのはいい思い出。
      #誰だよ、ディレクトリ名に「デスクトップ」なんて付けた奴は。「desktop」でいいじゃん

      • by Anonymous Coward on 2017年05月12日 19時21分 (#3209839)

        現行の Windows では Desktop ですね。
        むしろ、今は freedesktop.org 準拠のデスクトップ環境がホームに日本語ディレクトリを作ろうとする。

        親コメント
      • by Anonymous Coward
        c:\windows\筑集眺餅
      • by Anonymous Coward

        Windowsだと下手すると「desk top」を使う奴いるかもしれんからな
        #お願いだから「desktop」がどうしても嫌なら「desk_top」にして

        • by Anonymous Coward

          わかったぞと言いながら disktop にするオジサン……

          • by Anonymous Coward

            そこはむしろdesukutoppuだろう

    • by Anonymous Coward

      ええっ?

      NULでも/dev/nullでもいいけど、ビットバケツって絶対必要だと思うんだけどなぁ。。。
      盲腸扱いって斬新すぎて目からうろこが剥がれ落ちそうで落ちない
      うろこがないから。

      • by Anonymous Coward

        \\.\Device\Null に書き込めるようにすればいいんだけどなそんなのは

    • by Anonymous Coward

      本当はNTFS廃止でそこらへんの後方互換性もばっさり来られる予定だったんですけどねぇ。

  • by Anonymous Coward on 2017年05月12日 18時00分 (#3209789)

    10年以上windows使ってるけど初めて知ったわ
    拡張子ついててもダメなんだな

    • by Anonymous Coward on 2017年05月12日 21時12分 (#3209886)

      >10年以上windows使ってるけど初めて知ったわ

      古参ぶった発言だけど、よく考えりゃ2007年近辺からってことだよな
      つい最近じゃねーか@(ジャネーノ法則による年寄りの年代log scale誤認識)

      親コメント
    • by Anonymous Coward
      ディレクトリがサポートされていな MS-DOS 1.0 での仕様なのだよな。
      MS-DOS 2.0 で階層ディレクトリがサポートされたが、デバイスファイルは、互換性として階層なしのファイル名だけで操作できるままになった。

      現代まで、その部分の互換を引き続いてる。
      機能は追加されたが削除されてないので、当時のバッチファイルが今でも動くのは、すごいことだけど、本当に必要なのかは疑問もあるな。
      • by wood377 (46309) on 2017年05月14日 17時08分 (#3210570) 日記

        もしかしてと思ったが、

        windows10のコマンドプロンプトで、
          > dir/w
        としたら、動いた。 "/"がスイッチキャラクタとして認識されて、
        コマンドと分離されている。 ( "dir" と "/w" の間にスペース無し)

        ここで、スイッチキャラクタを "-" に変更すると、"-"のあるファイルが正しく認識されない筈。(隠しコマンドが有効なら)

        親コメント
      • by Anonymous Coward

        古いWindowsのソフトは動かなかったりするのに
        そんな盲腸みたいな部分の互換性は残ってるという……

      • by Anonymous Coward

        >>機能は追加されたが削除されてないので、当時のバッチファイルが今でも動くのは、すごいことだけど、本当に必要なのかは疑問もあるな。

        実は最近、昔のバッチがそのまま動かない事態に遭遇して難儀したことがある
        少しづつバッチ(DOS窓)の機能が追加・改良されて、逆に微妙に互換性が失われてる部分もあるんだよね
        #command/c なんて昔話なんだぁ.......

        • by wood377 (46309) on 2017年05月13日 19時09分 (#3210254) 日記

          32bitだったら、MS-DOSのプログラムがそのまま、動く事もある。
          まあ、実用的アプリがそのまま、動くとは言わないが、
          片手間に作った、ツール類が動く程度の互換性。

          凄いといえば、凄いが、その一方で、無理があるんだろうな、、と。

          親コメント
      • by Anonymous Coward
    • by Anonymous Coward

      20年使ってても知らないで済むことかもしれない

  • by Anonymous Coward on 2017年05月12日 19時02分 (#3209830)

    言ってみただけ。

typodupeerror

普通のやつらの下を行け -- バッドノウハウ専門家

読み込み中...