[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 メーリングリストの案内