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

[FDclone-users:00644] Re: 仕切り直します。



 しらいです。

In Message-Id <20061021211902.219731.05a3e0ae@isis.ocn.ne.jp>
        yuji tamura <yuji@isis.ocn.ne.jp>さんwrites:
> こんばんは田村です。

> [yuji:~] yuji% echo -n が|wc (メールからコピペした物、)
>        0       1       3
> [yuji:~] yuji% echo -n が|wc (純正ことえりの物、)
>        0       1       3
> [yuji:~] yuji% echo -n が|wc (egbridge Universalの物、)
>        0       1       3

 ほぅ、Mac OS X はまるっきり NF 対応されていないじゃないで
すか。これで例えば「ls -la が」と入力するとファイル名「が」
のファイル情報が表示されます?
 だとすると、API への入力側で kernel が normalization して
いるんでしょう。つまり、「ls -la が」でも「ls -la か゛」でも
ファイルにアクセス出来るようになっていると。

# 上の「゛」は実際は合成文字用の濁点です。


> [yuji:~] yuji% echo -n が|wc (メールからコピペして)
>        0       1       3
> [yuji:~] yuji% echo -n ??? | wc (コマンドライン編集)
>        0       1       5
> 
> 何てことになったりする事も、これが先日言っていた shell の件
> でしょうか?

 shell が normalization に介在しているとは考えにくいのです
が、ひょっとすると Apple が何か手を入れてるのかも知れません
ね。


> 次に [FDclone-users:00628] の件を確認。

 結局こういうことですね?

×	素の FD-2.09
○	libc.c:malloc2() の malloc() 引数のみ変更
×	libc.c:realloc2() の realloc() 引数のみ変更
○	libc.c:realloc2() の malloc()/realloc() 引数のみ変更

 確認ですが、最後のパターンでは malloc2() は素のままなんで
すよね?
 二つの独立した変更があって、両方変更しないと直らないとか、
どっちか一方だけ有効で他方の変更の有無は無関係とか、そういう
パターンは考え易いのですが、どっちでも有効というのは考え難い
パターンですね。
 多分、その malloc2() なり realloc2() なりで確保した領域に
対する overflow ではないためにこういうおかしな現象が生じてい
るんだと思います。
 だとすると元凶の特定が困難そうですね。


 では次は、どの malloc2()/realloc2() を置換えたら直るのかを
追求するのとは独立して、メモリの不正アクセスを行なっている疑
いのある部分を絞り込むという、二つの方向性で検証を行なってみ
ましょう。
 以下の検証では、それぞれまずが素の 2.09 に戻してから行なっ
て下さい。特に明記していない限りは複数の変更を同時に行なわな
いようにします。

◎検証 1
 browse.c:putname() が怪しそうなので、これをシンプルなもの
に置換えます。putname() の冒頭に数行変数宣言がありますが、そ
れに続けて以下の 3 行を追加して下さい。
	calclocate(no);
	cputs2(list[no].name);
	return(0);
 これで、各行のファイル名表示が非常にシンプルなものになりま
すが、カーソル移動くらいは出来るので、この状況でカーソル移動
等を繰返して再現性を確認して下さい。

◎検証 2
 カーソル移動だけで実行される関数としてもう一つ有力なのが、
browse.c:infobar() です。今度はこれを無効にしてみましょう。
infobar() の冒頭に以下の 1 行を追加して下さい。
	return;
 これで画面最下行の情報表示が無くなりますが、動作には不都合
ない筈ですので、この状況で再現性の確認をお願いします。

◎検証 1+2
 上記の検証を組み合わせて検証します。1 だけ、2 だけ、両方、
この 3 パターンで再現性を確認して下さい。

◎検証 3
 malloc2() を一つずつ置換えていって、どの malloc2() を置換
えたら直るのかを検証しましょう。func.h の最後に以下の一行を
追加します。
	#define	malloc3(s)	malloc(s * 16)
 この上で、全 source の malloc2() を一個ずつ malloc3() に書
換えてみて、どの malloc2() を書換えたら直るのかを検証してみ
て下さい。
 と言っても、malloc2() が全部で 200 個近くも使われています
ので、それを一個ずつ書換えては make して動作確認してとなると
膨大な時間を要します。
 なので、まずはファイル単位で特定しましょう。MAXPATHLEN の
時に行なったのと同じ方法です。#include "func.h" の直後に以下
の一行を追加します。
	#define	malloc2		malloc3
 怪しそうなファイルから順に適用していって、ファイルが特定出
来たら、今度はそのファイルの中の malloc2() を手動で malloc3()
に書換えていって、場所の特定をして下さい。
 怪しそうなファイルは browse.c/file.c/kanji.c/dosemu.c 辺り
でしょうかね。唯一 libc.c はこのやり方では確認出来ないので、
他のファイルから先に確認して下さい。
 もし最後に libc.c だけ残ったら、libc.c の中の malloc2() を
手動で malloc3() に書換えて確認します。

◎検証 4
 同じことを realloc2() でも行なってみましょう。func.h に追
加する一行はこうなります。
	#define	realloc3(p, s)	realloc(p, s * 16)
 同様に各ファイルの #include "func.h" の直後に追加する一行
はこうです。
	#define	realloc2	realloc3


> もしそうするとこれでは中途半端な検証になってしまいますか?

 もう中途半端だろうが何だろうが構わないので、表現の揺れでど
ちらとも解釈出来る箇所があるようでしたら、どっちか出来る方だ
けでも検証して下さい。もうそろそろ手詰りです。

                                               しらい たかし