Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0c8f31f authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Automerger Merge Worker
Browse files

Merge "Guard against excessively long package names and certificates." into...

Merge "Guard against excessively long package names and certificates." into tm-dev am: 23781f22 am: c05f453d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/32479564



Change-Id: Idd2125241cb3d33fca310d6f7b3475390f360f08
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents c4fc805a c05f453d
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -32,11 +32,13 @@ import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.UserHandle;

import com.android.internal.util.Preconditions;
import com.android.internal.util.function.pooled.PooledLambda;

import java.io.Closeable;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
@@ -153,6 +155,26 @@ public class BlobStoreManager {
    private final Context mContext;
    private final IBlobStoreManager mService;

    // TODO: b/404309424 - Make these constants available using a test-api to avoid hardcoding
    // them in tests.
    /**
     * The maximum allowed length for the package name, provided using
     * {@link BlobStoreManager.Session#allowPackageAccess(String, byte[])}.
     *
     * This is the same limit that is already used for limiting the length of the package names
     * at android.content.pm.parsing.FrameworkParsingPackageUtils#MAX_FILE_NAME_SIZE.
     *
     * @hide
     */
    public static final int MAX_PACKAGE_NAME_LENGTH = 223;
    /**
     * The maximum allowed length for the certificate, provided using
     * {@link BlobStoreManager.Session#allowPackageAccess(String, byte[])}.
     *
     * @hide
     */
    public static final int MAX_CERTIFICATE_LENGTH = 32;

    /** @hide */
    public BlobStoreManager(@NonNull Context context, @NonNull IBlobStoreManager service) {
        mContext = context;
@@ -786,6 +808,12 @@ public class BlobStoreManager {
         */
        public void allowPackageAccess(@NonNull String packageName, @NonNull byte[] certificate)
                throws IOException {
            Objects.requireNonNull(packageName);
            Preconditions.checkArgument(packageName.length() <= MAX_PACKAGE_NAME_LENGTH,
                    "packageName is longer than " + MAX_PACKAGE_NAME_LENGTH + " chars");
            Objects.requireNonNull(certificate);
            Preconditions.checkArgument(certificate.length <= MAX_CERTIFICATE_LENGTH,
                    "certificate is longer than " + MAX_CERTIFICATE_LENGTH + " chars");
            try {
                mSession.allowPackageAccess(packageName, certificate);
            } catch (ParcelableException e) {
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
package com.android.server.blob;

import static android.app.blob.BlobStoreManager.COMMIT_RESULT_ERROR;
import static android.app.blob.BlobStoreManager.MAX_CERTIFICATE_LENGTH;
import static android.app.blob.BlobStoreManager.MAX_PACKAGE_NAME_LENGTH;
import static android.app.blob.XmlTags.ATTR_CREATION_TIME_MS;
import static android.app.blob.XmlTags.ATTR_ID;
import static android.app.blob.XmlTags.ATTR_PACKAGE;
@@ -327,6 +329,11 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
            @NonNull byte[] certificate) {
        assertCallerIsOwner();
        Objects.requireNonNull(packageName, "packageName must not be null");
        Preconditions.checkArgument(packageName.length() <= MAX_PACKAGE_NAME_LENGTH,
                "packageName is longer than " + MAX_PACKAGE_NAME_LENGTH + " chars");
        Objects.requireNonNull(certificate, "certificate must not be null");
        Preconditions.checkArgument(certificate.length <= MAX_CERTIFICATE_LENGTH,
                "certificate is longer than " + MAX_CERTIFICATE_LENGTH + " chars");
        synchronized (mSessionLock) {
            if (mState != STATE_OPENED) {
                throw new IllegalStateException("Not allowed to change access type in state: "