Handle ParcelableException instead of crashing system server

Unhandled exception is causing system server to crash.

Bug: 146790672
Test: builds successfully
Change-Id: Ibfe53ee0309dcec6fd3b24f8b67fcb78f5ce7fd5
This commit is contained in:
Mohammad Samiul Islam
2020-01-14 18:33:39 +00:00
parent d69517ebf1
commit 8ce32fe577

View File

@@ -49,6 +49,7 @@ import android.os.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
@@ -570,18 +571,17 @@ public class StagingManager {
} else { } else {
params.installFlags |= PackageManager.INSTALL_DISABLE_VERIFICATION; params.installFlags |= PackageManager.INSTALL_DISABLE_VERIFICATION;
} }
try {
int apkSessionId = mPi.createSession( int apkSessionId = mPi.createSession(
params, originalSession.getInstallerPackageName(), params, originalSession.getInstallerPackageName(),
0 /* UserHandle.SYSTEM */); 0 /* UserHandle.SYSTEM */);
PackageInstallerSession apkSession = mPi.getSession(apkSessionId); PackageInstallerSession apkSession = mPi.getSession(apkSessionId);
try {
apkSession.open(); apkSession.open();
for (String apkFilePath : apkFilePaths) { for (String apkFilePath : apkFilePaths) {
File apkFile = new File(apkFilePath); File apkFile = new File(apkFilePath);
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(apkFile, ParcelFileDescriptor pfd = ParcelFileDescriptor.open(apkFile,
ParcelFileDescriptor.MODE_READ_ONLY); ParcelFileDescriptor.MODE_READ_ONLY);
long sizeBytes = pfd.getStatSize(); long sizeBytes = (pfd == null) ? -1 : pfd.getStatSize();
if (sizeBytes < 0) { if (sizeBytes < 0) {
Slog.e(TAG, "Unable to get size of: " + apkFilePath); Slog.e(TAG, "Unable to get size of: " + apkFilePath);
throw new PackageManagerException(errorCode, throw new PackageManagerException(errorCode,
@@ -589,11 +589,11 @@ public class StagingManager {
} }
apkSession.write(apkFile.getName(), 0, sizeBytes, pfd); apkSession.write(apkFile.getName(), 0, sizeBytes, pfd);
} }
} catch (IOException e) {
Slog.e(TAG, "Failure to install APK staged session " + originalSession.sessionId, e);
throw new PackageManagerException(errorCode, "Failed to write APK session", e);
}
return apkSession; return apkSession;
} catch (IOException | ParcelableException e) {
Slog.e(TAG, "Failure to install APK staged session " + originalSession.sessionId, e);
throw new PackageManagerException(errorCode, "Failed to create/write APK session", e);
}
} }
/** /**