Skip to content

Commit

Permalink
prevent a client from crashing surfaceflinger
Browse files Browse the repository at this point in the history
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
  • Loading branch information
pixelflinger authored and Android (Google) Code Review committed Oct 22, 2012
1 parent ba7dc2d commit d17e3b5
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions services/surfaceflinger/SurfaceFlinger.cpp
Expand Up @@ -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) {
Expand Down

0 comments on commit d17e3b5

Please sign in to comment.