diff options
| author | 2021-05-25 14:31:52 +0000 | |
|---|---|---|
| committer | 2021-05-25 14:31:52 +0000 | |
| commit | a3d681c3faad7eefe2e86b997fdffe7538a7855f (patch) | |
| tree | 3ce195e0bd5e5f9ea18b73d96d3bda2fe9d39c1b | |
| parent | 8f04b30c59ebb8bd3c7d66203d91113e078ed815 (diff) | |
| parent | 9b85a194e4118819b2bd9ab0bfb489f78ae1b529 (diff) | |
Merge "Add robustness for permissions errors to Surface APIs." into sc-dev
| -rw-r--r-- | libs/gui/Surface.cpp | 7 | ||||
| -rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 15 | ||||
| -rw-r--r-- | libs/gui/include/private/gui/ComposerService.h | 5 |
3 files changed, 15 insertions, 12 deletions
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index d27d1ecdbe..e117d1189c 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1268,8 +1268,11 @@ int Surface::query(int what, int* value) const { if (err == NO_ERROR) { return NO_ERROR; } - if (composerService()->authenticateSurfaceTexture( - mGraphicBufferProducer)) { + sp<ISurfaceComposer> surfaceComposer = composerService(); + if (surfaceComposer == nullptr) { + return -EPERM; // likely permissions error + } + if (surfaceComposer->authenticateSurfaceTexture(mGraphicBufferProducer)) { *value = 1; } else { *value = 0; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 80ff653d1e..371454a3de 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -65,12 +65,12 @@ ComposerService::ComposerService() connectLocked(); } -void ComposerService::connectLocked() { +bool ComposerService::connectLocked() { const String16 name("SurfaceFlinger"); - while (getService(name, &mComposerService) != NO_ERROR) { - usleep(250000); + mComposerService = waitForService<ISurfaceComposer>(name); + if (mComposerService == nullptr) { + return false; // fatal error or permission problem } - assert(mComposerService != nullptr); // Create the death listener. class DeathObserver : public IBinder::DeathRecipient { @@ -86,15 +86,16 @@ void ComposerService::connectLocked() { mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); + return true; } /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { ComposerService& instance = ComposerService::getInstance(); Mutex::Autolock _l(instance.mLock); if (instance.mComposerService == nullptr) { - ComposerService::getInstance().connectLocked(); - assert(instance.mComposerService != nullptr); - ALOGD("ComposerService reconnected"); + if (ComposerService::getInstance().connectLocked()) { + ALOGD("ComposerService reconnected"); + } } return instance.mComposerService; } diff --git a/libs/gui/include/private/gui/ComposerService.h b/libs/gui/include/private/gui/ComposerService.h index 50bd742b6a..fa1071a4e3 100644 --- a/libs/gui/include/private/gui/ComposerService.h +++ b/libs/gui/include/private/gui/ComposerService.h @@ -45,13 +45,12 @@ class ComposerService : public Singleton<ComposerService> Mutex mLock; ComposerService(); - void connectLocked(); + bool connectLocked(); void composerServiceDied(); friend class Singleton<ComposerService>; public: - // Get a connection to the Composer Service. This will block until - // a connection is established. + // a connection is established. Returns null if permission is denied. static sp<ISurfaceComposer> getComposerService(); }; |