libgui: Prevent segfaulting in abandoned ConsumerBase
mConsumer will be null if the ConsumerBase has been abandoned. Prevent
it from being dereferenced in those cases.
Bug 27718219
Change-Id: I9a3ecadb0655ec61cd2fd15ee98b3e1bef078cff
diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp
index ac8bc6e..cebcc4e 100644
--- a/libs/gui/GLConsumer.cpp
+++ b/libs/gui/GLConsumer.cpp
@@ -208,6 +208,10 @@
status_t GLConsumer::setDefaultBufferSize(uint32_t w, uint32_t h)
{
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setDefaultBufferSize: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
mDefaultWidth = w;
mDefaultHeight = h;
return mConsumer->setDefaultBufferSize(w, h);
@@ -1073,34 +1077,58 @@
void GLConsumer::setName(const String8& name) {
Mutex::Autolock _l(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setName: GLConsumer is abandoned!");
+ return;
+ }
mName = name;
mConsumer->setConsumerName(name);
}
status_t GLConsumer::setDefaultBufferFormat(PixelFormat defaultFormat) {
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setDefaultBufferFormat: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
return mConsumer->setDefaultBufferFormat(defaultFormat);
}
status_t GLConsumer::setDefaultBufferDataSpace(
android_dataspace defaultDataSpace) {
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setDefaultBufferDataSpace: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
}
status_t GLConsumer::setConsumerUsageBits(uint32_t usage) {
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setConsumerUsageBits: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
usage |= DEFAULT_USAGE_FLAGS;
return mConsumer->setConsumerUsageBits(usage);
}
status_t GLConsumer::setTransformHint(uint32_t hint) {
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setTransformHint: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
return mConsumer->setTransformHint(hint);
}
status_t GLConsumer::setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
Mutex::Autolock lock(mMutex);
+ if (mAbandoned) {
+ GLC_LOGE("setMaxAcquiredBufferCount: GLConsumer is abandoned!");
+ return NO_INIT;
+ }
return mConsumer->setMaxAcquiredBufferCount(maxAcquiredBuffers);
}