[sugj-tech:7004] Re: vfs_cap のバグ

MORIYAMA Masayuki moriyama @ miraclelinux.com
2009年 1月 6日 (火) 10:06:24 JST


森山です。

TAKAHASHI Motonobu wrote:
> -----
> [2009/01/02 13:38:16,  3] modules/vfs_cap.c:cap_readdir(73)
>   cap: cap_readdir: 新規テキスト文書.txt
> ホ2009/01/02 13:38:16,  3] lib/charcnv.c:convert_string_internal(252)
>   E2BIG: convert_string(CP932,UTF-16LE): srclen=2 destlen=2 - 'テキスト文書.txt
> 蟶c4:95:b6:8f:91.txt'
> -----

上記ログと、samba 3.2.6 のソースコードを grep して調
べただけですが、"テキスト" が半角カナであれば、iconv(3)
で E2BIG エラーになるのではないかと思われます。

# メールだとカタカナが半角カナなのか、全角カナなのか
# わからないのが難点ですね。

source/smbd/mangle_hash2.c:is_legal_name()

の次の箇所が怪しいです。

444     if (((unsigned int)name[0]) > 128 && (name[1] != 0)) {
445       /* Possible start of mb character. */
446       char mbc[2];
447       /*
448        * Note that if CH_UNIX is utf8 a string may be 3
449        * bytes, but this is ok as mb utf8 characters don't
450        * contain embedded ascii bytes. We are really checking
451        * for mb UNIX asian characters like Japanese (SJIS) here.
452        * JRA.
453        */
454       if (convert_string(CH_UNIX, CH_UTF16LE, name, 2, mbc, 2, False) == 2) {
455         /* Was a good mb string. */
456         name += 2;
457         continue;
458       }

半角カナ2文字分(srclen=2)を変換すると、UTF-16LE で2
文字分のバッファー領域として4バイトが必要になります。
しかし、上記コードは、UTF-16LE 1文字分の2バイト
(destlen=2)しか用意していないので E2BIG エラーになっ
てしまったのではないかと思われます。

--
森山 将之 Email: moriyama @ miraclelinux.com
          Web: http://www.miraclelinux.com/




sugj-tech メーリングリストの案内