OSDN Git Service

Fix 'jobscheduler run' shell command
authorChristopher Tate <ctate@google.com>
Thu, 27 Apr 2017 18:22:15 +0000 (11:22 -0700)
committerChristopher Tate <ctate@google.com>
Thu, 27 Apr 2017 19:14:20 +0000 (12:14 -0700)
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

services/core/java/com/android/server/job/JobSchedulerShellCommand.java

index 848704e..1c31c3e 100644 (file)
@@ -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;
-
-            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;
-
-            default:
-                // success!
-                pw.print("Running job");
-                if (force) {
-                    pw.print(" [FORCED]");
-                }
-                pw.println();
-                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_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;
+            }
+            return ret;
+        } finally {
+            Binder.restoreCallingIdentity(ident);
         }
-        return ret;
     }
 
     private int runMonitorBattery(PrintWriter pw) throws Exception {