Chromium Code Reviews| Index: tests/ImageDecodingTest.cpp |
| diff --git a/tests/ImageDecodingTest.cpp b/tests/ImageDecodingTest.cpp |
| index 89f59c5cdb240f87be0f2889d5f6a56ecb15225e..625ec59ce9044aba6fa716b626b658a220c54da5 100644 |
| --- a/tests/ImageDecodingTest.cpp |
| +++ b/tests/ImageDecodingTest.cpp |
| @@ -752,3 +752,67 @@ DEF_TEST(DiscardablePixelRef_SecondLockColorTableCheck, r) { |
| REPORTER_ASSERT(r, bitmap.getColorTable() && "second pass"); |
| } |
| } |
| + |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +namespace { |
| +class SingleAllocator : public SkBitmap::Allocator { |
| +public: |
| + // If the pixels in fPixles are big enough, use them. |
|
djsollen
2014/08/01 14:21:26
fPixels
|
| + virtual bool allocPixelRef(SkBitmap* bm, SkColorTable* ct) SK_OVERRIDE { |
| + SkASSERT(bm); |
| + if (bm->info().getSafeSize(bm->rowBytes()) <= fSize) { |
| + bm->setPixels(fPixels, ct); |
| + fPixels = NULL; |
| + fSize = 0; |
| + return true; |
| + } |
| + return bm->allocPixels(NULL, ct); |
| + } |
| + bool ready() { return fPixels != NULL; } |
| + SingleAllocator(void* p, size_t s) : fPixels(p), fSize(s) { } |
|
djsollen
2014/08/01 14:21:26
put constructor/destructor at the top of class.
|
| + ~SingleAllocator() {} |
| +private: |
| + void* fPixels; |
| + size_t fSize; |
| +}; |
| +} // namespace |
| + |
| +/* This tests for a bug in libjpeg where INT32 is typedefed to long |
| + and memory can be written to outside of the array. */ |
| +DEF_TEST(ImageDecoding_JpegOverwrite, r) { |
| + SkString resourceDir = GetResourcePath(); |
| + SkString path = SkOSPath::Join(resourceDir.c_str(), "randPixels.jpg"); |
| + SkAutoTUnref<SkStreamAsset> stream( |
| + SkStream::NewFromFile(path.c_str())); |
| + if (!stream.get()) { |
| + SkDebugf("\nPath '%s' missing.\n", path.c_str()); |
| + return; |
| + } |
| + SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream)); |
| + if (NULL == decoder.get()) { |
| + ERRORF(r, "\nSkImageDecoder::Factory failed.\n"); |
| + return; |
| + } |
| + SkAssertResult(stream->rewind()); |
| + |
| + static const uint16_t sentinal = 0xBEEF; |
| + static const int pixelCount = 16; |
| + SkAutoTMalloc<uint16_t> pixels(pixelCount + 1); |
| + // pixels.get() should be 4-byte aligned. |
| + // This is necessary to reproduce the bug. |
| + |
| + pixels[pixelCount] = sentinal; // This value should not be changed. |
| + |
| + SkAutoTUnref<SingleAllocator> allocator( |
| + SkNEW_ARGS(SingleAllocator, |
| + ((void*)pixels.get(), sizeof(uint16_t) * pixelCount))); |
| + decoder->setAllocator(allocator); |
| + decoder->setSampleSize(2); |
| + SkBitmap bitmap; |
| + bool success = decoder->decode(stream, &bitmap, kRGB_565_SkColorType, |
| + SkImageDecoder::kDecodePixels_Mode); |
| + REPORTER_ASSERT(r, success); |
| + REPORTER_ASSERT(r, !allocator->ready()); // Decoder used correct memory |
| + REPORTER_ASSERT(r, sentinal == pixels[pixelCount]); |
| +} |