Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: mknmz がcoreを吐いて終了する。



臼田です。

私も寺西さんと同じで紛らわしい拡張子を付けない方がいいと思いますが。
そんな拡張子を使うソフトもある??ということのようですから、
いくつか方法を提案してみます。

(でもバイナリファイルにtxtという拡張子をつけるのはかなり意地悪だと思います。
 まともな神経のメーカーならやらないでしょう。
 実は、またmacbinaryだったというオチのような気もします)

Taiji.Can@xxxxxxxxxxxxxxxxxxx wrote:
> 1. binary データを text/plain として扱い core を吐いて死ぬ。
> 
> ex: mknmz をしているときの log です。
> 
> 134064/184948 - /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt [text/plain]
> 
>   これで core を吐いて死にました。.txt とは書かれていますが、中身は
> 
> % file /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt
> /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt: data
> 
>   と、なります。以前作った File コマンドを使うと
> 
> % ./File /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt
> /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt: application/octet-stream
File-MMagicはバイナリデータであることを知っているが、mknmzは拡張子を信じてテキ
ストと判断しているということだと思います。
Magicデータが適合せず、ファイル内にSpecialのキーワードもないのでmknmzが拡張子
判定で決定していると思われます。
バイナリであることが分かっているのを拡張子判定でplane/textにしているのはもった
いないのでmknmz内での判定式を修正するとよいのでしょう。


> 2. binary データを text/plain として扱い core を吐いて死ぬ。ですが、
>    File コマンド自体での認識が 1 と異なります。
> 
> 192817/194393 - /home/Apache/htdocs/xxx/yyy/18.DOC [text/plain]
> 
> % file /home/Apache/htdocs/xxx/yyy/18.DOC
> /home/Apache/htdocs/xxx/yyy/18.DOC: data
> 
>   となりますが、File コマンドだと
> 
> %./File /home/Apache/htdocs/xxx/yyy/18.DOC
> /home/Apache/htdocs/xxx/yyy/18.DOC: text/plain
> 
>   となります。
File-MMagic内のchecktype_contents()から呼ばれている
check_binary()でテキストデータと判定されている
ためだろうと思います。

で、当面の具体的な提案は以下のとおりです。(サンプルファ
イルもないので検証はしておりません)

1つ目のものは
txtという拡張子はMMagic内でplane/textに関連付けられている
ことから、これを打ち消してあげるのが良いかと思います。
(案1)MMagic.pmを書き換えてtxtとplane/textの関連を消す
(案2)mknmzのapply_filterの判定条件にバイナリファイルで
    あることをうまく反映させるようにする
(案3)バイナリファイルにtxt拡張子をつけるのをやめる
案1だと本当のテキストファイルがどのような扱いに
なるかは無保証です。
案3が自然な対処方法だと思います。
案2だとテキスト偽装ファイル?(zip.txtですか?)に対する
潜在バグの除去にもなりよいでしょう。

2つ目の18.DOCというのは
ファイルの中身を見てみないとなぜtext/planeになるのかはわか
りませんがcheck_binary()での判定ルールを見ると2バイト文字
に関してはかなり精度が低そうな気がします。誤判定はやむを得
ないと思います。

問題のファイルが大文字DOCであり、ms-wordが小文字docになって
いるのであれば
mknmzを改造してしまい
add_targetでALLOW_FILE、DENY_FILEを判定している正規表現での
iオプションをはずして大文字小文字を区別するように変えてしまい
mknmzrcで
$ALLOW_FILEの".*\\.doc"を残し、$DENY_FILEに".*\\.DOC"
を追加して小文字のdocは対象として大文字のDOCのみ排除する
というのはいかがでしょうか。

(これもDOCといういかにも他で使われている拡張子をやめて
他のものに変えるほうが自然な対処法だと思います)

臼田幸生