diff options
author | Jorim Jaggi <jjaggi@google.com> | 2018-08-09 16:23:22 +0200 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2018-08-09 16:51:10 +0200 |
commit | 7804f7fae42a72799e6408176f6d56743752caa4 (patch) | |
tree | 735b58c5bac0474f1a97ecdf31ac98856c4aef8c | |
parent | d2e2541080c454db79d1fd585dc60509ffec6793 (diff) |
Fix BackgroundDexOptServiceIntegrationTests
- Ensure that calling uid is shell.
- Clear calling identity such that we don't get permission
failures when calling getCurrentUser()
Test: self
Change-Id: Ifbaceb47edbbc4a6b002d49411ca4635ffc33a08
Fixes: 111798412
2 files changed, 34 insertions, 21 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index bfa45e1fd16e..42a3b7120ed5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9021,6 +9021,20 @@ public class PackageManagerService extends IPackageManager.Stub } } + /** + * Enforces that only the system UID or shell's UID can call a method exposed + * via Binder. + * + * @param message used as message if SecurityException is thrown + * @throws SecurityException if the caller is not system or shell + */ + private static void enforceSystemOrShell(String message) { + final int uid = Binder.getCallingUid(); + if (uid != Process.SYSTEM_UID && uid != Process.SHELL_UID) { + throw new SecurityException(message); + } + } + @Override public void performFstrimIfNeeded() { enforceSystemOrRoot("Only the system can request fstrim"); @@ -9502,7 +9516,13 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; } - return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext, packageNames); + enforceSystemOrShell("runBackgroundDexoptJob"); + final long identity = Binder.clearCallingIdentity(); + try { + return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext, packageNames); + } finally { + Binder.restoreCallingIdentity(identity); + } } List<PackageParser.Package> findSharedNonSystemLibraries(PackageParser.Package p) { diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java index e247951f16ef..e509d2d87bf7 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java +++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java @@ -17,8 +17,10 @@ package com.android.server.pm; import android.app.AlarmManager; +import android.app.UiAutomation; import android.content.Context; import android.os.Environment; +import android.os.ParcelFileDescriptor; import android.os.SystemProperties; import android.os.storage.StorageManager; import android.support.test.InstrumentationRegistry; @@ -34,6 +36,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -141,27 +144,17 @@ public final class BackgroundDexOptServiceIntegrationTests { // Run the command and return the stdout. private static String runShellCommand(String cmd) throws IOException { Log.i(TAG, String.format("running command: '%s'", cmd)); - long startTime = System.nanoTime(); - Process p = Runtime.getRuntime().exec(cmd); - int res; - try { - res = p.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - String stdout = inputStreamToString(p.getInputStream()); - String stderr = inputStreamToString(p.getErrorStream()); - long elapsedTime = System.nanoTime() - startTime; - Log.i(TAG, String.format("ran command: '%s' in %d ms with return code %d", cmd, - TimeUnit.NANOSECONDS.toMillis(elapsedTime), res)); - Log.i(TAG, "stdout"); - Log.i(TAG, stdout); - Log.i(TAG, "stderr"); - Log.i(TAG, stderr); - if (res != 0) { - throw new RuntimeException(String.format("failed command: '%s'", cmd)); + ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation().getUiAutomation() + .executeShellCommand(cmd); + byte[] buf = new byte[512]; + int bytesRead; + FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); + StringBuilder stdout = new StringBuilder(); + while ((bytesRead = fis.read(buf)) != -1) { + stdout.append(new String(buf, 0, bytesRead)); } - return stdout; + fis.close(); + return stdout.toString(); } // Run the command and return the stdout split by lines. |