2011年02月24日

Android on Ubuntu の追加の修正

以前ARM Debian/Ubuntuの上でAndroidを動かす話をしました。その続きです。



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;


トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード