From cdbcb34c2babcd2523acbe3d359855fe1155e7c3 Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Thu, 20 Feb 2020 18:12:47 -0800 Subject: [PATCH] use shell to open v4 signature file BUG: 133435829 Test: atest PackageManagerShellCommandIncrementalTest Change-Id: I8e57b00f042f8b6c85d5f905460dd2da6199accc --- .../android/os/incremental/V4Signature.java | 13 ++++++------ .../server/pm/PackageManagerShellCommand.java | 21 ++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/core/java/android/os/incremental/V4Signature.java b/core/java/android/os/incremental/V4Signature.java index 17adfc8a05d96..6d334f539fc90 100644 --- a/core/java/android/os/incremental/V4Signature.java +++ b/core/java/android/os/incremental/V4Signature.java @@ -16,12 +16,12 @@ package android.os.incremental; +import android.os.ParcelFileDescriptor; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; /** @@ -41,11 +41,12 @@ public class V4Signature { /** * Construct a V4Signature from .idsig file. */ - public static V4Signature readFrom(File file) { - try (DataInputStream stream = new DataInputStream(new FileInputStream(file))) { + public static V4Signature readFrom(ParcelFileDescriptor pfd) throws IOException { + final ParcelFileDescriptor dupedFd = pfd.dup(); + final ParcelFileDescriptor.AutoCloseInputStream fdInputStream = + new ParcelFileDescriptor.AutoCloseInputStream(dupedFd); + try (DataInputStream stream = new DataInputStream(fdInputStream)) { return readFrom(stream); - } catch (IOException e) { - return null; } } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 1dda3ab52d2e7..0f06c186b9ff9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -97,6 +97,7 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.util.ArraySet; import android.util.PrintWriterPrinter; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.content.PackageHelper; @@ -139,6 +140,7 @@ class PackageManagerShellCommand extends ShellCommand { /** Path where ART profiles snapshots are dumped for the shell user */ private final static String ART_PROFILE_SNAPSHOT_DEBUG_LOCATION = "/data/misc/profman/"; private static final int DEFAULT_WAIT_MS = 60 * 1000; + private static final String TAG = "PackageManagerShellCommand"; final IPackageManager mInterface; final IPermissionManager mPermissionManager; @@ -3077,11 +3079,20 @@ class PackageManagerShellCommand extends ShellCommand { final long size = file.length(); final byte[] metadata = inPath.getBytes(StandardCharsets.UTF_8); - // Try to load a v4 signature for the APK. - final V4Signature v4signature = V4Signature.readFrom( - new File(inPath + V4Signature.EXT)); - final byte[] v4signatureBytes = - (v4signature != null) ? v4signature.toByteArray() : null; + byte[] v4signatureBytes = null; + // Try to load the v4 signature file for the APK; it might not exist. + final String v4SignaturePath = inPath + V4Signature.EXT; + final ParcelFileDescriptor pfd = openFileForSystem(v4SignaturePath, "r"); + if (pfd != null) { + try { + final V4Signature v4signature = V4Signature.readFrom(pfd); + v4signatureBytes = v4signature.toByteArray(); + } catch (IOException ex) { + Slog.e(TAG, "V4 signature file exists but failed to be parsed.", ex); + } finally { + IoUtils.closeQuietly(pfd); + } + } session.addFile(LOCATION_DATA_APP, name, size, metadata, v4signatureBytes); }