Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd63d318 authored by Grant Menke's avatar Grant Menke
Browse files

Ensure ScheduledExecutor is not shutdown before scheduling timeout cleanup.

The scheduled executor in ConnectionServiceWrapper may be shutdown when calling createConference and createCall. This is infrequently causing a `RejectedExecutionException`. This CL adds a check that mScheduledExecutor is not shutdown before scheduling the cleanup.

Flag: EXEMPT Security High/Critical Severity CVE
Bug: 388588560
Test: manually using the provided apk + atest CallsManagerTest
Change-Id: I0aaa0f7f57b8dd137403b6ceb7068e7c99652e1f
parent 9f52b6d8
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -1660,14 +1661,20 @@ public class ConnectionServiceWrapper extends ServiceBinder implements
                        }
                    }
                };
                if (mScheduledExecutor != null) {
                if (mScheduledExecutor != null && !mScheduledExecutor.isShutdown()) {
                    try {
                        // Post cleanup to the executor service and cache the future,
                        // so we can cancel it if needed.
                        ScheduledFuture<?> future = mScheduledExecutor.schedule(
                        r.getRunnableToCancel(),SERVICE_BINDING_TIMEOUT, TimeUnit.MILLISECONDS);
                                r.getRunnableToCancel(),SERVICE_BINDING_TIMEOUT,
                                TimeUnit.MILLISECONDS);
                        mScheduledFutureMap.put(call, future);
                    } catch (RejectedExecutionException e) {
                        Log.e(this, e, "createConference: mScheduledExecutor was "
                                + "already shutdown");
                    }
                } else {
                    Log.w(this, "createConference: Scheduled executor is null");
                    Log.w(this, "createConference: Scheduled executor is null or shutdown");
                    mAnomalyReporter.reportAnomaly(
                        NULL_SCHEDULED_EXECUTOR_ERROR_UUID,
                        NULL_SCHEDULED_EXECUTOR_ERROR_MSG);
@@ -1796,14 +1803,20 @@ public class ConnectionServiceWrapper extends ServiceBinder implements
                        }
                    }
                };
                if (mScheduledExecutor != null) {
                if (mScheduledExecutor != null && !mScheduledExecutor.isShutdown()) {
                    try {
                        // Post cleanup to the executor service and cache the future,
                        // so we can cancel it if needed.
                        ScheduledFuture<?> future = mScheduledExecutor.schedule(
                        r.getRunnableToCancel(),SERVICE_BINDING_TIMEOUT, TimeUnit.MILLISECONDS);
                                r.getRunnableToCancel(),SERVICE_BINDING_TIMEOUT,
                                TimeUnit.MILLISECONDS);
                        mScheduledFutureMap.put(call, future);
                    } catch (RejectedExecutionException e) {
                        Log.e(this, e, "createConnection: mScheduledExecutor was "
                                + "already shutdown");
                    }
                } else {
                    Log.w(this, "createConnection: Scheduled executor is null");
                    Log.w(this, "createConnection: Scheduled executor is null or shutdown");
                    mAnomalyReporter.reportAnomaly(
                        NULL_SCHEDULED_EXECUTOR_ERROR_UUID,
                        NULL_SCHEDULED_EXECUTOR_ERROR_MSG);