From 88c0e6f8abb94c9d05e6a3c3048ddef4a30ce5b6 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 13 Nov 2019 11:39:58 -0500 Subject: [PATCH] Fail a job when you can't instantiate it. This will still crash, but prevent apps from getting into crash loops when we have bad data in a job. --- .../securesms/jobmanager/JobController.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobmanager/JobController.java b/src/org/thoughtcrime/securesms/jobmanager/JobController.java index db94471788..5b35d0300f 100644 --- a/src/org/thoughtcrime/securesms/jobmanager/JobController.java +++ b/src/org/thoughtcrime/securesms/jobmanager/JobController.java @@ -322,14 +322,30 @@ class JobController { private @NonNull Job createJob(@NonNull JobSpec jobSpec, @NonNull List constraintSpecs) { Job.Parameters parameters = buildJobParameters(jobSpec, constraintSpecs); - Data data = dataSerializer.deserialize(jobSpec.getSerializedData()); - Job job = jobInstantiator.instantiate(jobSpec.getFactoryKey(), parameters, data); - job.setRunAttempt(jobSpec.getRunAttempt()); - job.setNextRunAttemptTime(jobSpec.getNextRunAttemptTime()); - job.setContext(application); + try { + Data data = dataSerializer.deserialize(jobSpec.getSerializedData()); + Job job = jobInstantiator.instantiate(jobSpec.getFactoryKey(), parameters, data); - return job; + job.setRunAttempt(jobSpec.getRunAttempt()); + job.setNextRunAttemptTime(jobSpec.getNextRunAttemptTime()); + job.setContext(application); + + return job; + } catch (RuntimeException e) { + Log.e(TAG, "Failed to instantiate job! Failing it and its dependencies without calling Job#onCanceled. Crash imminent."); + + List failIds = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(jobSpec.getId())) + .map(DependencySpec::getJobId) + .toList(); + + jobStorage.deleteJob(jobSpec.getId()); + jobStorage.deleteJobs(failIds); + + Log.e(TAG, "Failed " + failIds.size() + " dependent jobs."); + + throw e; + } } private @NonNull Job.Parameters buildJobParameters(@NonNull JobSpec jobSpec, @NonNull List constraintSpecs) {