[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00644] Re: 仕切り直します。
- Subject: [FDclone-users:00644] Re: 仕切り直します。
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Sat, 21 Oct 2006 23:15:12 +0900
しらいです。
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
> もしそうするとこれでは中途半端な検証になってしまいますか?
もう中途半端だろうが何だろうが構わないので、表現の揺れでど
ちらとも解釈出来る箇所があるようでしたら、どっちか出来る方だ
けでも検証して下さい。もうそろそろ手詰りです。
しらい たかし