Catch exceptions thrown from UpdateEngine#applyPayload.

Note: we can't add a CTS test for this behaviour since the UpdateEngine
is an implementation detail.

Fixes: 124106342
Test: Manually tested
Change-Id: Ib8e6895211b5d39a4d037d383c115011084ea257
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java b/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
index d5cfab9..5acf83a 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/AbUpdateInstaller.java
@@ -194,8 +194,17 @@
         }
 
         UpdateEngine updateEngine = buildBoundUpdateEngine();
-        updateEngine.applyPayload(
-                updatePath, mOffsetForUpdate, mSizeForUpdate, headerKeyValuePairs);
+        try {
+            updateEngine.applyPayload(
+                    updatePath, mOffsetForUpdate, mSizeForUpdate, headerKeyValuePairs);
+        } catch (Exception e) {
+            // Prevent an automatic restart when an update is already being processed
+            // (http://b/124106342).
+            Log.w(UpdateInstaller.TAG, "Failed to install update from file.", e);
+            notifyCallbackOnError(
+                    InstallSystemUpdateCallback.UPDATE_ERROR_UNKNOWN,
+                    "Failed to install update from file.");
+        }
     }
 
     private boolean updateStateForPayload() throws IOException {