Namazu-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mknmz がcoreを吐いて終了する。
寺西です。
Yukio USUDA wrote:
>
> > > > % ./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は拡張子を信じてテキ
> > > ストと判断しているということだと思います。
> >
> > たぶん未知データは全てバイナリとみなしているのであって、決して
> > バイナリデータであると知っているわけではないと思います。
> File::MMagic::checktype_data内で
> File::MMagic::check_binaryを用いてバイナリファイルであるかテキスト
> ファイルであるかを判定しています。
過去のバージョンでは application/octet-stream を未知データとして
扱っているようなところがあったように思いますが、現バージョンの
File::MMagic::checktype_data では、ご指摘の通りです。
多少、誤解がありました。失礼しました。
ただ、そこはそうなんですが、
File::MMagic::checktype_byfilename では、未知データをバイナリと
見なしています。
それと File::MMagic::check_binary のチェックは
> ファイル先頭ブロック中にコントロールコード等が全体の1割以上含まれて
> いたらバイナリデータであるとしているのでここでバイナリファイルとみな
> されたものは文字コードでなさそうなものをかなり含んでいると思われます。
とあるように、チェック自体が曖昧(仕方のないことですが)であり、
また、バイナリデータ全てを判定できるわけではなく、未知データと判断
される場合もあります。
このため、「バイナリデータであることを知っている」とは限らない
と思いましたが、
> % ./File /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt
> /home/Apache/htdocs/xxxx/doc/mp/manual/13prgm.txt: application/octet-stream
と、File コマンドで application/octet-stream と判断されていた
わけですね。ここを見落としていました。
ここで、application/octet-stream と判断されたということは、
「バイナリデータであることを知っている」と確かにいえますね。
> ということから
> > > バイナリであることが分かっているのを拡張子判定でplane/textにしているのはもった
> > > いないのでmknmz内での判定式を修正するとよいのでしょう。
> と考えました。
昔、別件でまとめていた判定ルーチンの流れです。(多少間違いが
あるかもしれません。)
1. $mtype_n = $Magic->checktype_byfilename()
2. $mtype_c = $Magic->checktype_data()
3. $mtype_c が未定義か、text/html, text/plain, application/octet-stream
なら、
$mtype_m = $Magic->checktype_magic()
4. $mtype_m が定義されており、
text/html, text/plain, application/octet-stream ならば
$mtype_c = $mtype_m
5. $mtype_c が未定義なら text/plain
6. $mtype_c が未定義か、$mtype_c と $mtype_n が同じなら $mtype_n
$mtype_c, $mtype_n が text/plain なら text/plain
$mtype_c が application/octet-stream なら application/octet-stream
// $mtype_c が application/(excel|powerpoint|msword) で
// $mtype_n が application/octet-stream なら $mtype_n
それ以外は $mtype_c
となっており、application/octet-stream になる条件を考えると、
・$mtype_c が application/octet-stream
となります。また $mtype_c が application/octet-stream になる
条件は、
・$Magic->checktype_magic() の結果が application/octet-stream
・$Magic->checktype_magic() の結果が未定義で、
$Magic->checktype_data() の結果が application/octet-stream
・$Magic->checktype_data() の結果と
$Magic->checktype_magic() の結果が未定義で、
$Magic->checktype_byfilename() の結果が application/octet-stream
一方で、File コマンドは MMagig::checktype_contents で判定しますので、
1. $mtype = checktype_magic()
2. $mtype が未定義なら $mtype = checktype_data()
3. $mtype が未定義なら text/plain
となり、application/octet-stream になる条件は、
・checktype_magic() が application/octet-stream
・checktype_magic() が未定義で、checktypedata() が
application/octet-stream
となります。
両者に違いがないように思えます。File コマンドで
application/octet-stream となれば、mknmz でも
application/octet-stream となりそうに思います。
# むむむ、何故結果が違う?
mknmz で text/plain と判断される条件は、
・$mtype_c が text/plain
・$mtype_c が未定義で、$Magic->checktype_byfilename() が
text/plain
ですから、前者は
・$Magic->checktype_data() の結果が未定義か、text/html, text/plain,
application/octet-stream で、$Magic->checktype_magic() の結果が
text/plain
であり、後者は
・$Magic->checktype_data() の結果と
$Magic->checktype_magic() の結果が未定義で、
$Magic->checktype_byfilename() の結果が text/plain
であり、File コマンドで application/octet-stream と判断される
条件では、text/plain にはならないはずです。
# むむむ、何故結果が違う?
当初は、
・$mtype_c が未定義で、$Magic->checktype_byfilename() が
text/plain
という条件で、拡張子 .txt のデータを text/plain と見なされたもの
と思っていましたが、どうやらそういうわけでもなさそうです。
ということで、何故 text/plain と判断されたのかは謎です。
(私の解析にミスがあるようです。)
> 話題としていた"13prgm.txt"はcheck_binaryでバイナリと判定されているの
> でmknmz内でのdecide_typeの判定条件を修正し対応できるだろうと思ったの
> ですが、
decide_type では、$Magic->checktype_magic() の結果が未定義で、
$Magic->checktype_data() の結果が application/octet-stream なら
application/octet-stream と判断するようですから、問題はないはずです。
たぶん。
# やっぱりデータがないとこれ以上の解析は無理ですね。解析ミスして
# しまいます。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E