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);