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

Commit 3c2f0a1c authored by Grant Menke's avatar Grant Menke Committed by mse1969
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
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:dd63d318cf090ca2d458f772e2799614e6068006)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ef6f10655531a06d2814c3fad25eb7cd1e117581)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5f4dfa3ead83c0b1eb9999b0389468d28347d167)
Merged-In: I0aaa0f7f57b8dd137403b6ceb7068e7c99652e1f
Change-Id: I0aaa0f7f57b8dd137403b6ceb7068e7c99652e1f
parent dc9d5b8e
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import java.util.Set;
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;
@@ -1163,11 +1164,21 @@ public class ConnectionServiceWrapper extends ServiceBinder implements
                                }
                            }
                        };
                // 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);
                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);
                        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 or shutdown");
                }
                try {
                    mServiceInterface.createConnection(
                            call.getConnectionManagerPhoneAccount(),