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;