From 6a94aba734b0dffedeb1744bdbe59341760b56b6 Mon Sep 17 00:00:00 2001 From: riddle_hsu Date: Fri, 1 May 2015 01:52:58 +0800 Subject: [PATCH] Fix NPE in JobServiceContext when closing job. Disconnect may come after job is canceled. Add a finished state to avoid cleanup finished job again. Real case: http://code.google.com/p/android/issues/detail?id=170814 Change-Id: I9c7a1b944a8393e30396f473ebeb8332e51f21f1 --- .../android/server/job/JobServiceContext.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index 63c8d92ee2b2b..d07fb136c020f 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -73,7 +73,7 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne private static final long OP_TIMEOUT_MILLIS = 8 * 1000; private static final String[] VERB_STRINGS = { - "VERB_BINDING", "VERB_STARTING", "VERB_EXECUTING", "VERB_STOPPING" + "VERB_BINDING", "VERB_STARTING", "VERB_EXECUTING", "VERB_STOPPING", "VERB_FINISHED" }; // States that a job occupies while interacting with the client. @@ -81,6 +81,7 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne static final int VERB_STARTING = 1; static final int VERB_EXECUTING = 2; static final int VERB_STOPPING = 3; + static final int VERB_FINISHED = 4; // Messages that result from interactions with the client service. /** System timed out waiting for a response. */ @@ -170,6 +171,7 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne mRunningJob = null; mParams = null; mExecutionStartTimeElapsed = 0L; + mVerb = VERB_FINISHED; removeOpTimeOut(); return false; } @@ -305,8 +307,8 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne break; case MSG_CALLBACK: if (DEBUG) { - Slog.d(TAG, "MSG_CALLBACK of : " + mRunningJob + " v:" + - (mVerb >= 0 ? VERB_STRINGS[mVerb] : "[invalid]")); + Slog.d(TAG, "MSG_CALLBACK of : " + mRunningJob + + " v:" + VERB_STRINGS[mVerb]); } removeOpTimeOut(); @@ -522,8 +524,12 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne * we want to clean up internally. */ private void closeAndCleanupJobH(boolean reschedule) { - final JobStatus completedJob = mRunningJob; + final JobStatus completedJob; synchronized (mLock) { + if (mVerb == VERB_FINISHED) { + return; + } + completedJob = mRunningJob; try { mBatteryStats.noteJobFinish(mRunningJob.getName(), mRunningJob.getUid()); } catch (RemoteException e) { @@ -536,7 +542,7 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne mWakeLock = null; mRunningJob = null; mParams = null; - mVerb = -1; + mVerb = VERB_FINISHED; mCancelled.set(false); service = null; mAvailable = true;