From 851a35abe856be6d33917be979628e64e3c019e5 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 27 Apr 2017 11:22:15 -0700 Subject: [PATCH] Fix 'jobscheduler run' shell command Tidying up the locking + deferred-work shape of the job scheduler's internal flow inadvertently meant that we were now trying to bind to a job service while under the shell user's uid when the relevant shell command was used to kick off the job. Now we don't do that. Bug 37744607 Test: manual Change-Id: Ia4b83f83f9fbd2e5678eaa279f1d86206fb05023 --- .../server/job/JobSchedulerShellCommand.java | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java index 848704ec58c41..1c31c3e6af962 100644 --- a/services/core/java/com/android/server/job/JobSchedulerShellCommand.java +++ b/services/core/java/com/android/server/job/JobSchedulerShellCommand.java @@ -109,44 +109,49 @@ public class JobSchedulerShellCommand extends ShellCommand { final String pkgName = getNextArgRequired(); final int jobId = Integer.parseInt(getNextArgRequired()); - int ret = mInternal.executeRunCommand(pkgName, userId, jobId, force); - switch (ret) { - case CMD_ERR_NO_PACKAGE: - pw.print("Package not found: "); - pw.print(pkgName); - pw.print(" / user "); - pw.println(userId); - break; + final long ident = Binder.clearCallingIdentity(); + try { + int ret = mInternal.executeRunCommand(pkgName, userId, jobId, force); + switch (ret) { + case CMD_ERR_NO_PACKAGE: + pw.print("Package not found: "); + pw.print(pkgName); + pw.print(" / user "); + pw.println(userId); + break; - case CMD_ERR_NO_JOB: - pw.print("Could not find job "); - pw.print(jobId); - pw.print(" in package "); - pw.print(pkgName); - pw.print(" / user "); - pw.println(userId); - break; + case CMD_ERR_NO_JOB: + pw.print("Could not find job "); + pw.print(jobId); + pw.print(" in package "); + pw.print(pkgName); + pw.print(" / user "); + pw.println(userId); + break; - case CMD_ERR_CONSTRAINTS: - pw.print("Job "); - pw.print(jobId); - pw.print(" in package "); - pw.print(pkgName); - pw.print(" / user "); - pw.print(userId); - pw.println(" has functional constraints but --force not specified"); - break; + case CMD_ERR_CONSTRAINTS: + pw.print("Job "); + pw.print(jobId); + pw.print(" in package "); + pw.print(pkgName); + pw.print(" / user "); + pw.print(userId); + pw.println(" has functional constraints but --force not specified"); + break; - default: - // success! - pw.print("Running job"); - if (force) { - pw.print(" [FORCED]"); - } - pw.println(); - break; + default: + // success! + pw.print("Running job"); + if (force) { + pw.print(" [FORCED]"); + } + pw.println(); + break; + } + return ret; + } finally { + Binder.restoreCallingIdentity(ident); } - return ret; } private int runMonitorBattery(PrintWriter pw) throws Exception {