2011年02月24日
Android on Ubuntu の追加の修正
KZM-A9-DualボードでGUI無しでARM Ubuntuを起動して、そこからchrootを使ってAndroidを起動しています。Ubuntuのsshdは生きたままなので、sshでログインすると、bashやvi, pstree, strace, gcc, objdumpなど使いたい便利なツールは全てapt-getでインストールすることができます。
とても気に入っているのですが、USBハブ経由で、USBメモリ、USBキーボード、USBマウスをつないだ状態でAndroidをchrootで起動したら、うまくいきませんでした。実はこの前のSEGVのログはこのときのものです。
NetlinkEventはカーネルからのNETLINK_KOBJECT_UEVENTのソケットのメッセージだけを想定して作られていて、udevdが同じソケットに別のフォーマットのメッセージを流したときに落ちてしまいます。前回は"@"を含まないメッセージは無視するような修正を入れたのですが、よく考えたらそれでは不十分でした。udevdのメッセージはバイナリの数値を含むのでそれが偶然"@"になってしまうことはあり得ます。
udevdからのメッセージは先頭に"udevd-"+ バージョン番号文字列 から始まることをudevdのソースで確認したので、そのパターンを無視するように修正しました。それでSEGVは発生しなくなりました。
修正パッチ
system/core/libsysutils/src/NetlinkEvent.cpp
diff --git a/libsysutils/src/NetlinkEvent.cpp b/libsysutils/src/NetlinkEvent.cpp index c2ba647..f006ddf 100644 --- a/libsysutils/src/NetlinkEvent.cpp +++ b/libsysutils/src/NetlinkEvent.cpp @@ -63,11 +63,16 @@ bool NetlinkEvent::decode(char *buffer, int size) { int i; int first = 1; + if (!strncmp(s, "udev-", strlen("udev-"))) { + return false; + } end = s + size; while (s < end) { if (first) { char *p; - for (p = s; *p != '@'; p++); + for (p = s; *p != '@'; p++) { + if (p >= end) return false; + } p++; mPath = strdup(p); first = 0;