[samba-jp:22679] dos charsetパラメータについて (Re: Samba4を「ふつうに」使おう!資料の公開)

TAKAHASHI Motonobu/高橋 基信 monyo @ monyo.com
2015年 11月 17日 (火) 02:01:59 JST


たかはしもとのぶです。

> オープンソース・ソリューション・テクノロジ株式会社
> 小田切です。
> 
> > dos charsetについては、ソースを見る限り、プリンタ機能の一部で使われて
> > いる他、smb_iconv()関数などから参照されていると思います。
> > 
> > このsmb_iconv()関数が更にラップされて……となっているようで、正直
> > 追い切れてないのですが、機能的にいうとブラウジング機能などからは
> > 呼び出されているはずだと思ってます。
> 
> ソースコード読んでないですが、関係するのは 95 98 Me で2000,XP以降は関係
> ないのでは?

ちょっと時間ができたので、もう少しソースコードを調べてみました。
ちなみに、ブラウジング機能はそもそもUnicode化されていないため、
Windows NT系(2000/XP以降含む)もANSIの文字コードを使用します。

unix charset = UTF-8(デフォルト)の環境で、netbios nameパラメータや
workgroupパラメータにUTF-8の日本語文字列を指定してみましたが、
dos charsetの指定如何に関わらず、そもそも正しく動作しませんでした。

dos charset = CP932を指定しなかった場合は文字コード変換に失敗して、
文字列が(おそらく)ヌル文字列になり、指定した場合は文字化けした
文字列が表示されるため、動作に関与はしているのですが……といった
感じです。

これらのNetBIOS名を表示する前に、セキュリティ対策で危険性が高い
文字を削除する処理が行われてるっぽいため、それが原因だったと
記憶しています。

> > とはいえ、プリンタ名やコンピュータ名などで日本語を使うなど
> > しない限り影響は発生しないと思いますし、ファイルサーバ機能などでは
> > 問題は発生しないので、影響が少ないのは確かだと考えています。
> 
> 同様に関係するのは 95 98 Me で2000,XP以降は関係ないのでは?

その他はソースコードを追った限りですが、max protocolパラメータで
NT1より前を指定した際の動作の一部や、古いメールスロット関連の
メッセージ呼び出し、OS/2固有の印刷関連メッセージ呼び出しなどでは、
dos charsetパラメータが関与しているっぽい感じです。

Sambaのソースコード上、dos charsetパラメータの値は、
smb_iconv_handle_reinit()関数のオプションで指定されているだけで、
この関数でどこかの領域に保存された値が、以降文字コード変換関数が
呼び出される際に、参照されるという動作になっています。

上記のようにdos charsetパラメータの値自体が直接参照はされていないと
いう実装もあり、ソースコードを追い切れていないのですが、いろいろ
コードを追ってみて、最終的にSamba内部の文字コード変換でSTR_ASCIIが
指定されている個所を中心に調べました。

> > ただ、まったく意味がないとまでは言い切れないと思っていて、日本語
> > 環境であれば、設定したほうがリスクが減るとは思いますので、一応
> > 説明には含めました。
> 
> HPがHP-UX向けに、IBMがAIX向けに出しているSambaにはiconvがちゃんと入って
> いなくて、dos charset=cp932 を設定するとエラーになる、という問題があって
> もう説明しない方が良いかと思っています。

わたしも最近説明を端折ってしまってましたが、CP932云々は、
あくまでglibcもしくはGNU libiconvで実装されているiconv関数で
定義されている名称なので、ほかの実装では違いますよね…。

例えばSolarisだとCP932相当の名称はms932で、かつこれを指定しても
UTF-8との相互変換しかできない実装のため、Sambaには対応していない
とか。

dos charsetパラメータについての技術的な状況はこんな感じかなと
思ってます。

・本パラメータを適切に設定する上では、glibcもしくはGNU libiconvが
 提供するiconv()関数、もしくは同等の機能を有するiconv()関数の
 実装を使用する必要がある
(そのため、Linux以外の環境では、通常OS付属のiconv()関数ではなく、
 別途libiconvをインストールしたうえで、Sambaがそれを使用する
 ようにビルドする必要がある)
※今回の話題と外れますが、FreeBSD 9以降のOS付属のiconv()は、検証
 してみる価値があると考えています。

・ファイルサーバ機能を含む大半の機能については、設定しなくても
 問題は発生しないと考えられる。ただし、設定しなかった場合に
 まったく影響がないとは言い切れない

上記を踏まえると、次のような感じかなと思ってます。

・上記を踏まえ、無用のトラブルを避ける意味で、Linux環境では適切に
 設定しておいた方がより無難
→ただし、設定しなくても実害がでる可能性は低いと考えられる

・Linux以外の環境(iconv()関数の実装に問題がある環境)、すなわち
 本パラメータを適切に設定できない環境では、デフォルト値のままで
 使用しても基本的には問題ないと思われる
→問題が発生してしまった場合や気になる場合は、別途GNU libiconvを
 インストールしたうえで、GNU libiconvの使用を明示した上で、Sambaを
 ビルドする必要がある(が、いわゆる野良ビルドとなる懸念もあり)

-- 
TAKAHASHI Motonobu/高橋 基信 <monyo @ monyo.com>
      @damemonyo / facebook.com/takahashi.motonobu


samba-jp メーリングリストの案内