Windows 95/98の2バイト文字ディレクトリ処理に関する不具合
KB番号 | J0001 |
最終更新日 | 2006/08/09 |
作成者 | たかはしもとのぶ |
最終更新者 |
対象
この文書は、以下のプロダクトに付いて説明したものです。
- Samba 2.0.9 日本語版リリース1.0
- Samba 2.0.7 日本語版
- Samba 2.0.5a 日本語版 JP2
- Samba 2.0.5a 日本語版 JP1
- Windows Me
- Windows 98
- Windows 95
現象
Windows 95/98/MeからSamba サーバ上の2バイト文字のディレクトリにアクセスを行なうと、以下のように親ディレクトリ名の一部がディレクトリのフルパス名に継承されたパス名でアクセスが行なわれてしまうという不具合が発生します。 この不具合は以下のようにすると再現します。赤字の部分のディレクトリ名に不具合が発生しています。
C:\>net use n: \\サーバ名\共有名 C:\>n: N:\>mkdir 123456789 N:\>cd 123456789 N:\>123456789>mkdir 漢字文字 N:\>123456789>cd 漢字文字 N:\>123456789\漢字文字5687>
この結果、Windows 9x系のOSからSamba上の共有にあるフルパス名に日本語を含む実行ファイルを実行しようとすると、以下のようなエラーが表示されたポップアップウインドウが発生して実行できない場合があります。
ファイル '<ファイルのフルパス名>'(またはその構成ファイル)が見つかりません。 パスおよびファイル名が正しいか、必要なライブラリが全て利用可能かどうか、 確認してください。
上記ウインドウとともに、「プログラム開始エラー」というタイトルで以下のような警告ウインドウも表示されます。
必要なDLLファイル <ファイルのフルパス名> が見つかりませんでした。
上記ダイアログボックス中の <ファイルのフルパス名>をよくみると、パス名が不正になっているのが確認できます。 ただし、この場合でもファイルのオープンや書き込みは可能です。
この現象はWindows 9xクライアントがWindows 9xのサーバに対してアクセスを行なったときにも再現しますが、Windows NT/2000のサーバに対してアクセスを行なった場合は再現しません。 また、Samba 2.2.0においても再現しません。
原因
Windows 9x 系の文字列処理のバグが原因です。以下このバグに付いて解説します。
Windows 9x ではフルパス名中の各要素を処理する際に、同じバッファを繰り返し用いているようです。しかもこの領域は利用前に初期化されない実装になっているため、利用する時点では、前回変換を行なった文字列が残ってしまっていると考えられます。
例えばtest\あというパス名を処理する場合、「あ」を処理する時点では、バッファ中に「test」が残っていると考えられます。またバッファはUCS-2(全ての文字が2 バイト長)で書き込まれていると考えられるため、「あ」を書き込んだ時点では、バッファは「あest」となっていると考えられます。
ここで結果を取り出す際に、Windows 9x では単純に先頭から「あ」の文字数(2文字)分の文字列を取得してしまっています。上記の例では「あe」が取り出されてしまっています。実際はMS- DOSの符号化コードに換算したバイト数分を取り出す必要があります。
結果として、
- MS-DOSの符号化コードにおける2バイト文字がフルパス名中に含まれる
- パス名の要素を先頭から順番に見ていった場合、2バイト文字が含まれる要素の直前の要素が、2バイト文字が含まれる要素の文字数(バイト数ではなく)より、長い文字数である
場合にこの不具合が発生します。例えば
n:\ab\あ\x.exe
Windows 9xやSambaサーバと通信を行なうときには、ファイルのフルパス名をMS-DOSの符号化コード(日本語の場合はShift_JIS)で送信しますが、この符号化の過程で、問題が発生するようです。Windows 9x でも Windows NT/2000 と通信を行なうときには、ファイルのフルパス名をUCS-2のまま送信するため、この不具合は発生しないようです。 関連情報として、以下もご参照ください。
対処方法
この問題に対応したSamba 2.0.10日本語版リリース1.0を利用してください。
Samba 2.0.5a 日本語版はJP2で対応していますが、対応が不完全なため、短いファイル名を利用するアプリケーションで不具合が発生する可能性があります。
オリジナル版ではこのパッチが受け入れられていなかったために、Samba 2.0.7日本語版で同じ問題が発生してしています。
Samba 2.0.7日本語版は以下の暫定パッチにて対応しました。問題が発生している場合はこのパッチをソースに適用した上で、再コンパイルを行なってください。
またSamba 2.0.7オリジナル版および、リリース2.2以前のSamba 2.0.7日本語版に対しても、同様のロジックを適用することで、この問題を修正することが可能です。
なお、以前配布していたsamba-2.0.7-ja-2.2_trans2.patch では、Windows NT からアクセスする際、特定のディレクトリ構造で「予期しないエラーが発生しました」というエラーメッセージが発生してしまう事象が報告されたため、新規にパッチを作成し直しています。
この技術情報は samba-jp:09525, sugj-tech:2979 をはじめとする多数の議論を参考に作成されています。