Merge branch 'fix-npe-verifying-perms' into 'master'

Fix npe verifying perms

Fixed a NPE for apps with no permissions.

Here is an example of the logging output for a couple of apps too after my change:

```
D/ApkVerifier(10929): Checking permissions
D/ApkVerifier(10929): Actual:
D/ApkVerifier(10929):   None
D/ApkVerifier(10929): Expected:
D/ApkVerifier(10929):   None
```

and

```
D/ApkVerifier(10929): Checking permissions
D/ApkVerifier(10929): Actual:
D/ApkVerifier(10929):   android.permission.READ_EXTERNAL_STORAGE
D/ApkVerifier(10929):   android.permission.WRITE_EXTERNAL_STORAGE
D/ApkVerifier(10929):   android.permission.SET_WALLPAPER
D/ApkVerifier(10929):   android.permission.SET_WALLPAPER_HINTS
D/ApkVerifier(10929):   android.permission.WRITE_SETTINGS
D/ApkVerifier(10929): Expected:
D/ApkVerifier(10929):   android.permission.SET_WALLPAPER
D/ApkVerifier(10929):   android.permission.READ_EXTERNAL_STORAGE
D/ApkVerifier(10929):   android.permission.SET_WALLPAPER_HINTS
D/ApkVerifier(10929):   android.permission.WRITE_SETTINGS
D/ApkVerifier(10929):   android.permission.WRITE_EXTERNAL_STORAGE
```

See merge request !407
This commit is contained in:
Hans-Christoph Steiner 2016-10-17 14:42:23 +00:00
commit 5d2c2bc6e6
2 changed files with 15 additions and 3 deletions

View File

@ -99,6 +99,15 @@ public class ApkVerifierTest {
assertTrue(extendedPermsXml.exists());
}
@Test
public void testNulls() {
assertTrue(ApkVerifier.requestedPermissionsEqual(null, null));
String[] perms = new String[] {"Blah"};
assertFalse(ApkVerifier.requestedPermissionsEqual(perms, null));
assertFalse(ApkVerifier.requestedPermissionsEqual(null, perms));
}
@Test
public void testWithoutPrefix() {
Apk apk = new Apk();

View File

@ -23,6 +23,7 @@ import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
@ -80,8 +81,6 @@ class ApkVerifier {
}
// verify permissions, important for unattended installer
Utils.debugLog(TAG, "localPermissions: " + TextUtils.join("\n", localApkInfo.requestedPermissions));
Utils.debugLog(TAG, "expectedPermissions: " + TextUtils.join("\n", expectedApk.requestedPermissions));
if (!requestedPermissionsEqual(expectedApk.requestedPermissions, localApkInfo.requestedPermissions)) {
throw new ApkPermissionUnequalException("Permissions in APK and index.xml do not match!");
}
@ -103,7 +102,11 @@ class ApkVerifier {
* data format is {@link String} arrays but they are in effect sets. This is the
* same data format as {@link android.content.pm.PackageInfo#requestedPermissions}
*/
public static boolean requestedPermissionsEqual(String[] expected, String[] actual) {
public static boolean requestedPermissionsEqual(@Nullable String[] expected, @Nullable String[] actual) {
Utils.debugLog(TAG, "Checking permissions");
Utils.debugLog(TAG, "Actual:\n " + (actual == null ? "None" : TextUtils.join("\n ", actual)));
Utils.debugLog(TAG, "Expected:\n " + (expected == null ? "None" : TextUtils.join("\n ", expected)));
if (expected == null && actual == null) {
return true;
}