home link download back number special issue

HMDT - Back Number / March, 2002


March, 2002


March 27 - Aqua Adopation Scenarios
keywords: Aqua

Apple のページをさまよっているうちに見つけた、Aqua のポーティングガイドの図。

"Respect the Dock" っていう項目があるけど、これは Dock の位置をちゃんと気にしておけ、っていうことらしい。たとえば、ズームボタンを押した時に、ウィンドウが Dock の下に重ならないようにするとか。IE はこれ守ってないじゃん。

March 24 - リンク再編中
keywords: Link

いままでリンクページをほとんどほったらかしてあったんで、一念発起して再編することにしたよ。だけど、普通のリンクページ作っても、手間がかかるし、おれ根性ないからまた途中でほっぽってしまいそうだし、他にすごい人がいっぱいいるしな。どうしようかな〜。

と、考えた結果、技術系ドキュメントやサンプルコードに特化してみることにしたよ。ADC にあるドキュメントへのリンクと、ひとこと解説をつけてみた。これなら、「らしさ」が出るし、自分にも役に立ちそうだし。まずは Mac OS X 関連ドキュメントからやってます。

March 21 - オブジェクトカルトクイズ
keywords: Dylan

オブジェクトカルトクイズ。オブジェクト指向のカルトクイズだ。やるな、オージス総研。っつーか、変だよ、オージス総研。

で、なぜ反応したかというと、一問目が Dylan がらみだったから。おぉー、Dylan!なつかしいなー。ちなみに Dylan は、昔の Apple の研究所が作った言語で、「オブジェクト指向やろうか」「でも、どの言語もいまいち気に入らないんだよ」「じゃ、作るか」と、いった感じで作られた言語だそうな(適当)。

あの頃の Apple は、役に立たない研究にどんどん金を注ぎ込んで、おもしろそうで中途半端な技術をいっぱい作って、赤字を垂れ流してたんだよな。端から見てると、そっちの方が面白いのに。

ちなみに、カルトクイズは一問目しか分かりませんでした。

March 21 - 今日のAdobe GoLive 6
keywords: HTML editor

Mac で使っているのに、デフォルトの dpi が 96 にされてるよ。

なぜだ。しかも直し方がよく分からん。Web Settings で Browser profiles を作っても、起動し直すと消えてしまう。なぜだ。ゆるせん。

March 19 - Adobe GoLive 6
keywords: HTML editor

GoLive の 6.0 が届いたよ。やっと Mac OS X で動くぜ。これで Classic を立ち上げる必要が完全になくなったよ。もう、Mac OS 9 のパーティションは消してやるー。

動作は、あいかわらず重いです。PowerBook ではきつい。この、すかすかのページでもそんなに快適にエディットできない。レイアウトとソースコード画面が分割表示できるのはうれしいなー。

でも、いちばんうれしいのは、Web DAV サーバ接続機能だったりする。これで、iDisk につなぐとき、あの、すったこの Finder の Web DAV を使わなくていいんだー!Finder さぁ、使いにくいのはがまんするから、iDisk につなぐと 30 秒虹色カーソル回すのはやめてくれ。まったく使い物にならん。それにくらべて、GoLive の Web DAV は、ちゃんと使い物になるよ。Goliath は、なんか proxy 通すとうまく動かなかったし。あと、Web DAV は Windows の IE でもサポートしてるから、iDisk につなぐには Windows の方がずっと快適だったりしてた。

March 15 - zlib の脆弱性と Mac OS X
keywords: zlib

こないだ zlib に脆弱性が見つかったぜ、っていうニュースがあったよね。CERT/CC Vulnerability Note とか、ZDNN:zlib圧縮ライブラリに脆弱性,Linuxほか多数のプログラムに影響とかで。Mac と見せかけて UNIX である Mac OS X でもその影響が心配されたんだけど、リンクとか備忘録とか日記とかさんや、pigmon.log(ぴぐもん禄)さんで知りましたが、Apple が問題ねーぜという見解を出してた。おぉ、力強いお言葉。というか、ぜんぜん情報がねーじゃん。てなわけで、自分でおっかけてみました。

まず、zlib の脆弱性とはなにか?CET/CC によれば、zlib を使って展開するときに、悪意のあるデータが来ると、malloc の二重解放をしてしまう恐れがある、と。じゃ、malloc の二重解放っていうのはなにか?メモリの割り当てと解放をする関数に、malloc と free っていうのがあるんだ。malloc はメモリを割り当てて、free で解放する。問題になるのは、一回 free で解放した領域をもう一度 free しちゃったとき。多くの場合、動作は不定になる。動作不定っていうのは、何が起こるかわからない。アプリケーションが異常終了するかもしれないし、他のメモリ領域を壊すかもしれないし、OS がパニックするかもしれないし、ハードディスクがクラッシュするかもしれないし、Mac に翼が生えて飛んでいってしまうかもしれない。ま、要は、そんなことするな、っていうことだ。

zlib は、あるデータが来ると、malloc の二重解放をしてしまうらしい。これは、明らかなバグだね。直さないといけない。Mac OS X の zlib はどうなっているのか?うーんと、よく知らない。

だけど、もうちょっと考えてみると、そもそも malloc の二重解放で致命的な事態が引き起こされなければいいわけだよね。セキュリティーホール memo さんの 3.12 の追記によると、FreeBSD では malloc を二重解放してもだいじょぶだよ、と作者が言っているらしい。

これどういうことかっていうと、malloc を実装するときは、空きメモリを管理する必要があるんだけど、多くの実装では空きメモリのリストを、malloc で割り当てられたメモリのそばにおいてあるんだ。もっと詳しい説明は、ここでは手に余るから K&R を読んでくれ。だから、一回 free されちゃうと、そのリストが壊されちゃう、と。それに対して FreeBSD では、空きメモリの管理を別のところで行っている。だから malloc の二重解放をしてもだいじょぶだよ、ということだそうだ。

ほうほう。じゃ、Mac OS X でどうなっているのか?まず、軽く実験。malloc の二重解放をしてみる。

[localhost:~] mkino% cat test.c
#include <stdio.h>

main()
{
        char* p;
        p = malloc(256);
        p = malloc(256);
        free(p);
        free(p);
}
[localhost:~] mkino% cc test.c
test.c: In function `main':
test.c:6: warning: assignment makes pointer from integer without a cast
test.c:7: warning: assignment makes pointer from integer without a cast
[localhost:~] mkino% ./a.out
*** malloc[281]: Deallocation of a pointer not malloced: 0x443c0; This 
could be a double free(), or free() called with the middle of an 
allocated block; Try setting environment variable MallocHelp to see 
tools to help debug
[localhost:~] mkino% 

お、ちゃんと二重解放に対して warning を出してるじゃない。つまり malloc の二重解放をしても致命的な事態は起きないようだ。じゃ、実際の管理はどうなっているの?ということで、Darwin のソースコードをのぞきにいく。Darwin CVS からたどれるよ。それによると、Darwin の内部では、zone 構造体を使って malloc の管理をしているらしい。

xnu/osfmk/kern/zalloc.h
struct zone {
        int         count;         /* Number of elements used now */
        vm_offset_t free_elements;
        vm_size_t   cur_size;      /* current memory utilization */
        vm_size_t   max_size;      /* how large can this zone grow */
        vm_size_t   elem_size;     /* size of an element */
        vm_size_t   alloc_size;    /* size used for more memory */
        char        *zone_name;    /* a name for the zone */
        unsigned int
        /* boolean_t */ exhaustible :1,   /* (F) merely return if empty? */
        /* boolean_t */ collectable :1,   /* (F) garbage collect empty pages */
        /* boolean_t */ expandable :1,    /* (T) expand zone (with message)? */
        /* boolean_t */ allows_foreign :1,/* (F) allow non-zalloc space */
        /* boolean_t */ doing_alloc :1,   /* is zone expanding now? */
        /* boolean_t */ waiting :1,       /* is thread waiting for expansion? */
        /* boolean_t */ async_pending :1; /* asynchronous allocation pending? */
        struct zone *   next_zone;        /* Link for all-zones list */
        call_entry_data_t call_async_alloc; /* callout for asynchronous alloc */
#if     ZONE_DEBUG
        queue_head_t ctive_zones;   /* active elements */
#endif  /* ZONE_DEBUG */
        decl_simple_lock_data(,lock)   /* generic lock */
};

これを使って、使用メモリと空きメモリの管理をしている。で、これが保存されている場所は malloc されるとこからは離れている。実際に free するときは、

xnu/osfmk/kern/zalloc.c
xnu/osfmk/kern/zalloc.c
void
zfree(
	register zone_t	zone,
	vm_offset_t	elem)
{

#if MACH_ASSERT
	/* Basic sanity checks */
	if (zone == ZONE_NULL || elem == (vm_offset_t)0)
		panic("zfree: NULL");
	/* zone_gc assumes zones are never freed */
	if (zone == zone_zone)
		panic("zfree: freeing to zone_zone breaks zone_gc!");
	if (zone->collectable && !zone->allows_foreign &&
	    (!from_zone_map(elem) || !from_zone_map(elem+zone->elem_size-1)))
		panic("zfree: non-allocated memory in collectable zone!");
#endif

で、malloc された領域かどうかチェックしている。(でもここ ASSERT するのかな、、、?)

というわけで、結論は、

  • zlib の脆弱性は malloc の二重解放の問題による
  • でも Mac OS X では、malloc 二重解放してもだいじょぶ
  • だから zlib だいじょぶ

ということかな。うーん、これであっているのかどうか、自信はないぞー。

March 13 - NSDictioanry の property list 表示
keywords: description

Cocoa 1001、NSDictinoary を ASCII 表示にしよう、という話。

Cocoa 1001

Adobe の GoLive 6.0 を注文したよ。なにはなくとも Mac OS X 上で使いたいから。理由それだけ。

March 12 - HTTP の勉強
keywords: HTTP

Studying HTTPっていうサイトがあります。その名のとおり、HTTP の解説をしています。RFC のガイド的な解説といったスタンスです。理解しやすいです。人に読ませることを前提に、サイトと文章を作っていて、好感が持てます。

「HTTP 勉強しなきゃいけないど、いきなり RFC 読むのはめんどくさいよなー」っていう人にお勧めです。それは、おれか。

Studying HTTP - http://www.studyinghttp.net

March 06 - テーブルの構造
keywords: NSTableView

Cocoa 1001、Interface Builder を使うと簡単にテーブルが使えるけど、その中身はどうなってるの?自分で作るにはどうすればいいの?って話です。

Cocoa 1001 - AppKit/NSTableView

March 05 - View の階層構造
keywords: subviews

Cocoa 1001、view の階層構造の話なのです。subview を辿っていって、どういう親子関係になっているか調べよう、という話だ。

Cocoa 1001

しばらくは、リハビリモードで、こんな感じでそろそろと。

March 04 - ポップアップメニューの枠を消す
keywords: NSPopUpButton, setBordered

ひさしぶりに Cocoa プログラミングをやったよ。一月ぐらい、あっちへふらふら、こっちをちょろちょろ、とつまみ食いばかりしてしまった。で、なかなか勘が戻らないので、こんな簡単な話題から。

Cocoa 1001 - AppKit/NSPopUpButton

どうってことのない話なんだけど、これができるまで 1 時間かかってしまった。だめだねー。


Home | Link | Download | Back Number | Speciall Issue

mailto: mkino@xd5.so-net.ne.jp

HMDT