Merge "Add robustness for permissions errors to Surface APIs." into sc-dev am: a3d681c3fa
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/14466581
Change-Id: Iac50ee1a56ae80ba32de7ad212a43bc4dd145cb6
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
index d27d1ec..e117d11 100644
--- a/libs/gui/Surface.cpp
+++ b/libs/gui/Surface.cpp
@@ -1268,8 +1268,11 @@
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 80ff653..371454a 100644
--- a/libs/gui/SurfaceComposerClient.cpp
+++ b/libs/gui/SurfaceComposerClient.cpp
@@ -65,12 +65,12 @@
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 @@
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 50bd742..fa1071a 100644
--- a/libs/gui/include/private/gui/ComposerService.h
+++ b/libs/gui/include/private/gui/ComposerService.h
@@ -45,13 +45,12 @@
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();
};