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