From cede54cce10db0e3a3a00a7a2617a37df1553146 Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Fri, 7 Jul 2017 11:41:03 -0700 Subject: Always copy file before parsing it for installing (cherry picked from commit 731ab89e06eb9a8d0b0ba8fc7e4df45c42c8741e) Fixes: 129039920 Fixes: 140195904 Merged-In: Ib2abc1d84311dec40e2f9e78551850984cd7ab82 --- src/com/android/packageinstaller/InstallStart.java | 18 +++++++++--------- .../packageinstaller/PackageInstallerActivity.java | 11 ++++------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/com/android/packageinstaller/InstallStart.java b/src/com/android/packageinstaller/InstallStart.java index 1eb6de80..fa118534 100644 --- a/src/com/android/packageinstaller/InstallStart.java +++ b/src/com/android/packageinstaller/InstallStart.java @@ -21,6 +21,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.IActivityManager; +import android.content.ContentResolver; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; @@ -42,7 +43,6 @@ import com.android.internal.annotations.VisibleForTesting; public class InstallStart extends Activity { private static final String LOG_TAG = InstallStart.class.getSimpleName(); - private static final String SCHEME_CONTENT = "content"; private static final String DOWNLOADS_AUTHORITY = "downloads"; private IActivityManager mIActivityManager; private IPackageManager mIPackageManager; @@ -110,20 +110,20 @@ public class InstallStart extends Activity { } else { Uri packageUri = intent.getData(); - if (packageUri == null) { - // if there's nothing to do, quietly slip into the ether + if (packageUri != null && (packageUri.getScheme().equals(ContentResolver.SCHEME_FILE) + || packageUri.getScheme().equals(ContentResolver.SCHEME_CONTENT))) { + // Copy file to prevent it from being changed underneath this process + nextActivity.setClass(this, InstallStaging.class); + } else if (packageUri != null && packageUri.getScheme().equals( + PackageInstallerActivity.SCHEME_PACKAGE)) { + nextActivity.setClass(this, PackageInstallerActivity.class); + } else { Intent result = new Intent(); result.putExtra(Intent.EXTRA_INSTALL_RESULT, PackageManager.INSTALL_FAILED_INVALID_URI); setResult(RESULT_FIRST_USER, result); nextActivity = null; - } else { - if (packageUri.getScheme().equals(SCHEME_CONTENT)) { - nextActivity.setClass(this, InstallStaging.class); - } else { - nextActivity.setClass(this, PackageInstallerActivity.class); - } } } diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java index 0f41c982..d005c37d 100644 --- a/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -25,6 +25,7 @@ import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -74,8 +75,7 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On private static final int REQUEST_TRUST_EXTERNAL_SOURCE = 1; - private static final String SCHEME_FILE = "file"; - private static final String SCHEME_PACKAGE = "package"; + static final String SCHEME_PACKAGE = "package"; static final String EXTRA_CALLING_PACKAGE = "EXTRA_CALLING_PACKAGE"; static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO"; @@ -568,7 +568,7 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On mPm.getApplicationIcon(mPkgInfo.applicationInfo)); } break; - case SCHEME_FILE: { + case ContentResolver.SCHEME_FILE: { File sourceFile = new File(packageUri.getPath()); PackageParser.Package parsed = PackageUtil.getPackageInfo(this, sourceFile); @@ -586,10 +586,7 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On } break; default: { - Log.w(TAG, "Unsupported scheme " + scheme); - setPmResult(PackageManager.INSTALL_FAILED_INVALID_URI); - finish(); - return false; + throw new IllegalArgumentException("Unexpected URI scheme " + packageUri); } } -- cgit v1.2.3