OSDN Git Service

prevent a client from crashing surfaceflinger
authorMathias Agopian <mathias@google.com>
Mon, 22 Oct 2012 21:27:45 +0000 (14:27 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Mon, 22 Oct 2012 21:54:23 +0000 (14:54 -0700)
a misbehaving or malicious client could cause SF to crash
by providing a "fake" IInterface. we now check the
IInterface we get is our own and local.

Bug: 7278879
Change-Id: Ia19d05902d4b2385c5a16416148378d4998833fd

services/surfaceflinger/SurfaceFlinger.cpp

index 38e02f1..26e9c60 100644 (file)
@@ -1681,8 +1681,23 @@ void SurfaceFlinger::setTransactionState(
     count = state.size();
     for (size_t i=0 ; i<count ; i++) {
         const ComposerState& s(state[i]);
-        sp<Client> client( static_cast<Client *>(s.client.get()) );
-        transactionFlags |= setClientStateLocked(client, s.state);
+        // Here we need to check that the interface we're given is indeed
+        // one of our own. A malicious client could give us a NULL
+        // IInterface, or one of its own or even one of our own but a
+        // different type. All these situations would cause us to crash.
+        //
+        // NOTE: it would be better to use RTTI as we could directly check
+        // that we have a Client*. however, RTTI is disabled in Android.
+        if (s.client != NULL) {
+            sp<IBinder> binder = s.client->asBinder();
+            if (binder != NULL) {
+                String16 desc(binder->getInterfaceDescriptor());
+                if (desc == ISurfaceComposerClient::descriptor) {
+                    sp<Client> client( static_cast<Client *>(s.client.get()) );
+                    transactionFlags |= setClientStateLocked(client, s.state);
+                }
+            }
+        }
     }
 
     if (transactionFlags) {