summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorJamie Gennis <jgennis@google.com>2011-06-20 15:34:00 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-20 15:34:00 -0700
commitc972c795cfdb0d16d664510b5041e43cfdc2a5ac (patch)
treeec8f0e4686903bdb3351f7d2129984d20ff8032d /libs
parentb2af97e9a11119a257289cb8c539b5de79093052 (diff)
parentaff74054189a4276a250eac91ac301ab2df37ae3 (diff)
downloadframeworks_base-c972c795cfdb0d16d664510b5041e43cfdc2a5ac.zip
frameworks_base-c972c795cfdb0d16d664510b5041e43cfdc2a5ac.tar.gz
frameworks_base-c972c795cfdb0d16d664510b5041e43cfdc2a5ac.tar.bz2
Merge "SurfaceTexture: fix a NULL ptr dereference."
Diffstat (limited to 'libs')
-rw-r--r--libs/gui/SurfaceTextureClient.cpp45
1 files changed, 36 insertions, 9 deletions
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 22b0852..b9b2310 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -143,12 +143,40 @@ int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) {
int SurfaceTextureClient::cancelBuffer(android_native_buffer_t* buffer) {
LOGV("SurfaceTextureClient::cancelBuffer");
Mutex::Autolock lock(mMutex);
+ int i = getSlotFromBufferLocked(buffer);
+ if (i < 0) {
+ return i;
+ }
+ mSurfaceTexture->cancelBuffer(i);
+ return OK;
+}
+
+int SurfaceTextureClient::getSlotFromBufferLocked(
+ android_native_buffer_t* buffer) const {
+ bool dumpedState = false;
for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
- if (mSlots[i]->handle == buffer->handle) {
- mSurfaceTexture->cancelBuffer(i);
- return OK;
+ // XXX: Dump the slots whenever we hit a NULL entry while searching for
+ // a buffer.
+ if (mSlots[i] == NULL) {
+ if (!dumpedState) {
+ LOGD("getSlotFromBufferLocked: encountered NULL buffer in slot %d "
+ "looking for buffer %p", i, buffer->handle);
+ for (int j = 0; j < NUM_BUFFER_SLOTS; j++) {
+ if (mSlots[j] == NULL) {
+ LOGD("getSlotFromBufferLocked: %02d: NULL", j);
+ } else {
+ LOGD("getSlotFromBufferLocked: %02d: %p", j, mSlots[j]->handle);
+ }
+ }
+ dumpedState = true;
+ }
+ }
+
+ if (mSlots[i] != NULL && mSlots[i]->handle == buffer->handle) {
+ return i;
}
}
+ LOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle);
return BAD_VALUE;
}
@@ -169,13 +197,12 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
} else {
timestamp = mTimestamp;
}
- for (int i = 0; i < NUM_BUFFER_SLOTS; i++) {
- if (mSlots[i]->handle == buffer->handle) {
- return mSurfaceTexture->queueBuffer(i, timestamp);
- }
+ int i = getSlotFromBufferLocked(buffer);
+ if (i < 0) {
+ return i;
}
- LOGE("queueBuffer: unknown buffer queued");
- return BAD_VALUE;
+ mSurfaceTexture->queueBuffer(i, timestamp);
+ return OK;
}
int SurfaceTextureClient::query(int what, int* value) const {