From e2e1ef0581c188014a0b11bbf46325b82d959720 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Thu, 9 Jun 2016 15:22:15 -0700 Subject: [PATCH] fix prefix generation when performing bitwise operations, java promotes byte's to int's. this is normally okay except when the value is negative. in that case, java extends the sign bits. this means that after shifting, all of the upper bits are most likely going to be all f's. instead, undo the sign extension by pulling out just the 8 bits we're interested in. Change-Id: I89f7244f6b675be2cca4a185a7002b5f8a6eece1 --- core/java/android/content/pm/EphemeralResolveInfo.java | 8 ++++---- .../java/com/android/server/pm/PackageManagerService.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/java/android/content/pm/EphemeralResolveInfo.java b/core/java/android/content/pm/EphemeralResolveInfo.java index afb4c30d6a996..b87731b99be41 100644 --- a/core/java/android/content/pm/EphemeralResolveInfo.java +++ b/core/java/android/content/pm/EphemeralResolveInfo.java @@ -57,10 +57,10 @@ public final class EphemeralResolveInfo implements Parcelable { mDigestBytes = generateDigest(uri); mDigestPrefix = - mDigestBytes[0] << 24 - | mDigestBytes[1] << 16 - | mDigestBytes[2] << 8 - | mDigestBytes[3] << 0; + (mDigestBytes[0] & 0xFF) << 24 + | (mDigestBytes[1] & 0xFF) << 16 + | (mDigestBytes[2] & 0xFF) << 8 + | (mDigestBytes[3] & 0xFF) << 0; mFilters.addAll(filters); mPackageName = packageName; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index bd6ddcb3409f4..b1fb1c4f27b70 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5000,10 +5000,10 @@ public class PackageManagerService extends IPackageManager.Stub { final byte[] hostBytes = intent.getData().getHost().getBytes(); final byte[] digestBytes = digest.digest(hostBytes); int shaPrefix = - digestBytes[0] << 24 - | digestBytes[1] << 16 - | digestBytes[2] << 8 - | digestBytes[3] << 0; + (digestBytes[0] & 0xFF) << 24 + | (digestBytes[1] & 0xFF) << 16 + | (digestBytes[2] & 0xFF) << 8 + | (digestBytes[3] & 0xFF) << 0; final List ephemeralResolveInfoList = mEphemeralResolverConnection.getEphemeralResolveInfoList(shaPrefix); if (ephemeralResolveInfoList == null || ephemeralResolveInfoList.size() == 0) {