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

Commit 0ad9ab07 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Avoid null app context in StaticApplicationContextServiceFetcher.

StaticApplicationContextServiceFetcher passes the application
context to the services it creates, but sometimes the application
context can be null. Cases we've seen so far are:

- Apps that (incorrectly) call getSystemService in
  attachBaseContext. In this case the passed-in context is what
  will become the application context soon afterwards.
- ActivityThread$ApplicationThread.setHttpProxy. In this case the
  passed-in context is the system context.

In both of these cases the passed-in context is never freed, so
passing it in to the service will not result in a leak.

Bug: 27532714
Bug: 27502146
Bug: 27337770
Change-Id: I5971c67b0e699d1a77850be8a338a448a96ec7d7
parent 37127f86
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -882,7 +882,12 @@ final class SystemServiceRegistry {
        public final T getService(ContextImpl ctx) {
            synchronized (StaticApplicationContextServiceFetcher.this) {
                if (mCachedInstance == null) {
                    mCachedInstance = createService(ctx.getApplicationContext());
                    Context appContext = ctx.getApplicationContext();
                    // If the application context is null, we're either in the system process or
                    // it's the application context very early in app initialization. In both these
                    // cases, the passed-in ContextImpl will not be freed, so it's safe to pass it
                    // to the service. http://b/27532714 .
                    mCachedInstance = createService(appContext != null ? appContext : ctx);
                }
                return mCachedInstance;
            }