Merge "Fix potential OOM in update_verifier"
diff --git a/common.h b/common.h
index bda7935..62fb132 100644
--- a/common.h
+++ b/common.h
@@ -43,4 +43,6 @@
 
 bool is_ro_debuggable();
 
+bool reboot(const std::string& command);
+
 #endif  // RECOVERY_COMMON_H
diff --git a/recovery.cpp b/recovery.cpp
index 5876981..3041d6c 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -208,6 +208,14 @@
     return android::base::GetBoolProperty("ro.debuggable", false);
 }
 
+bool reboot(const std::string& command) {
+    std::string cmd = command;
+    if (android::base::GetBoolProperty("ro.boot.quiescent", false)) {
+        cmd += ",quiescent";
+    }
+    return android::base::SetProperty(ANDROID_RB_PROPERTY, cmd);
+}
+
 static void redirect_stdio(const char* filename) {
     int pipefd[2];
     if (pipe(pipefd) == -1) {
@@ -1448,12 +1456,18 @@
     printf("reason is [%s]\n", reason);
 
     Device* device = make_device();
-    ui = device->GetUI();
+    if (android::base::GetBoolProperty("ro.boot.quiescent", false)) {
+        printf("Quiescent recovery mode.\n");
+        ui = new StubRecoveryUI();
+    } else {
+        ui = device->GetUI();
 
-    if (!ui->Init(locale)) {
-      printf("Failed to initialize UI, use stub UI instead.");
-      ui = new StubRecoveryUI();
+        if (!ui->Init(locale)) {
+            printf("Failed to initialize UI, use stub UI instead.\n");
+            ui = new StubRecoveryUI();
+        }
     }
+
     // Set background string to "installing security update" for security update,
     // otherwise set it to "installing system update".
     ui->SetSystemUpdateText(security_update);
@@ -1525,7 +1539,7 @@
                     ui->Print("Retry attempt %d\n", retry_count);
 
                     // Reboot and retry the update
-                    if (!android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,recovery")) {
+                    if (!reboot("reboot,recovery")) {
                         ui->Print("Reboot failed\n");
                     } else {
                         while (true) {
@@ -1630,7 +1644,7 @@
 
         default:
             ui->Print("Rebooting...\n");
-            android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,");
+            reboot("reboot,");
             break;
     }
     while (true) {
diff --git a/ui.cpp b/ui.cpp
index 9194ae3..cad7449 100644
--- a/ui.cpp
+++ b/ui.cpp
@@ -227,7 +227,7 @@
 
           case RecoveryUI::REBOOT:
             if (reboot_enabled) {
-                android::base::SetProperty(ANDROID_RB_PROPERTY, "reboot,");
+                reboot("reboot,");
                 while (true) { pause(); }
             }
             break;
diff --git a/updater/install.cpp b/updater/install.cpp
index 857d7f1..888239c 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -890,7 +890,10 @@
     return StringValue("");
   }
 
-  const std::string reboot_cmd = "reboot," + property;
+  std::string reboot_cmd = "reboot," + property;
+  if (android::base::GetBoolProperty("ro.boot.quiescent", false)) {
+    reboot_cmd += ",quiescent";
+  }
   android::base::SetProperty(ANDROID_RB_PROPERTY, reboot_cmd);
 
   sleep(5);