summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColin Cross2011-01-04 20:18:45 -0600
committerColin Cross2011-01-04 20:21:22 -0600
commitf7ca6040616f672a6f0039d55e39c610b7c1cf91 (patch)
treec7ef22e5cff4199b8b2c4b3426586d87b7611a9c
parentb4d65399fde02280b718e3b5b5cb1464a885c4b0 (diff)
downloadplatform-system-core-f7ca6040616f672a6f0039d55e39c610b7c1cf91.tar.gz
platform-system-core-f7ca6040616f672a6f0039d55e39c610b7c1cf91.tar.xz
platform-system-core-f7ca6040616f672a6f0039d55e39c610b7c1cf91.zip
Fix infinite loop in init when debugging is turned offandroid-2.3.3_r1.1android-2.3.3_r1
If a keychord is pressed when debugging is turned off, the main event poll in init will return an event on the keychord fd, but handle_keychord never reads the data. Once this happens, the poll will always return immediately, and init enters an infinite loop. Fix it by always reading from the keychord fd, but only handling the returned keychord if debugging is enabled. Change-Id: Ie4efa98247d3cc978d275dc8a4516b32aa710278
-rw-r--r--init/keychords.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/init/keychords.c b/init/keychords.c
index 53ab39115..febb62fab 100644
--- a/init/keychords.c
+++ b/init/keychords.c
@@ -103,14 +103,14 @@ void handle_keychord()
103 // and on user builds for users that are developers. 103 // and on user builds for users that are developers.
104 debuggable = property_get("ro.debuggable"); 104 debuggable = property_get("ro.debuggable");
105 adb_enabled = property_get("init.svc.adbd"); 105 adb_enabled = property_get("init.svc.adbd");
106 ret = read(keychord_fd, &id, sizeof(id));
107 if (ret != sizeof(id)) {
108 ERROR("could not read keychord id\n");
109 return;
110 }
111
106 if ((debuggable && !strcmp(debuggable, "1")) || 112 if ((debuggable && !strcmp(debuggable, "1")) ||
107 (adb_enabled && !strcmp(adb_enabled, "running"))) { 113 (adb_enabled && !strcmp(adb_enabled, "running"))) {
108 ret = read(keychord_fd, &id, sizeof(id));
109 if (ret != sizeof(id)) {
110 ERROR("could not read keychord id\n");
111 return;
112 }
113
114 svc = service_find_by_keychord(id); 114 svc = service_find_by_keychord(id);
115 if (svc) { 115 if (svc) {
116 INFO("starting service %s from keychord\n", svc->name); 116 INFO("starting service %s from keychord\n", svc->name);