Detect undersize buffers being delivered by ANativeWindow Change-Id: I02f328e7a2ad46877d00d5bc1de1439bebb23802 Reviewed-on: https://swiftshader-review.googlesource.com/3012 Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Greg Hartman <ghartman@google.com>
diff --git a/src/Main/FrameBufferAndroid.cpp b/src/Main/FrameBufferAndroid.cpp index daa178a..cc9eb00 100644 --- a/src/Main/FrameBufferAndroid.cpp +++ b/src/Main/FrameBufferAndroid.cpp
@@ -6,8 +6,8 @@ namespace sw { FrameBufferAndroid::FrameBufferAndroid(ANativeWindow* window, int width, int height) - : FrameBuffer(width, height, false, false), - nativeWindow(window), buffer(0), gralloc(0) + : FrameBuffer(width, height, false, false), + nativeWindow(window), buffer(0), gralloc(0) { hw_module_t const* pModule; hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); @@ -31,15 +31,14 @@ void FrameBufferAndroid::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format format) { copy(source, format); - nativeWindow->queueBuffer(nativeWindow, buffer, -1); + nativeWindow->queueBuffer(nativeWindow, buffer, -1); + if (buffer && locked) + { + locked = 0; + unlock(buffer); + } - if (buffer && locked) - { - locked = 0; - unlock(buffer); - } - - buffer->common.decRef(&buffer->common); + buffer->common.decRef(&buffer->common); } void* FrameBufferAndroid::lock() @@ -65,6 +64,13 @@ return NULL; } + if ((buffer->width < width) || (buffer->height < height)) + { + ALOGI("lock failed: buffer of %dx%d too small for window of %dx%d", + buffer->width, buffer->height, width, height); + return NULL; + } + switch(buffer->format) { default: ALOGE("Unsupported buffer format %d", buffer->format); ASSERT(false);