From 35ef567140e42f354be4a98cce6a7666ac085c13 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Sun, 8 Jul 2012 12:25:45 +0200 Subject: [PATCH] Fix SkBitmap::fPixels not being locked correctly In some cases bitmap's pixels where freed during encoding, which caused a null pointer dereference. This fix makes sure that underlaying buffer is locked for the whole process of compression. Change-Id: I0ac56821f5d333072271dc2670fa30f1562adfa3 --- core/jni/android/graphics/Bitmap.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 3c27caf65c7f6..1bba5b434477b 100644 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -298,8 +298,18 @@ static bool Bitmap_compress(JNIEnv* env, jobject clazz, SkBitmap* bitmap, } bool success = false; - SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); - if (NULL != strm) { + if (NULL != bitmap) { + SkAutoLockPixels alp(*bitmap); + + if (NULL == bitmap->getPixels()) { + return false; + } + + SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); + if (NULL == strm) { + return false; + } + SkImageEncoder* encoder = SkImageEncoder::Create(fm); if (NULL != encoder) { success = encoder->encodeStream(strm, *bitmap, quality);