Do not create an SkRawCodec with zero dimensions
authorLeon Scroggins III <scroggo@google.com>
Fri, 2 Dec 2016 21:47:53 +0000 (16:47 -0500)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 2 Dec 2016 22:23:35 +0000 (22:23 +0000)
Add a test

BUG=skia:3534
BUG=b/33300701

Change-Id: Ifb3a824a36998c5e626c4ad58466845f49d18ebf
Reviewed-on: https://skia-review.googlesource.com/5568
Commit-Queue: Leon Scroggins <scroggo@google.com>
Reviewed-by: Matt Sarett <msarett@google.com>
resources/empty_images/zero_height.tiff [new file with mode: 0644]
src/codec/SkRawCodec.cpp
tests/CodecTest.cpp

diff --git a/resources/empty_images/zero_height.tiff b/resources/empty_images/zero_height.tiff
new file mode 100644 (file)
index 0000000..ea7a477
Binary files /dev/null and b/resources/empty_images/zero_height.tiff differ
index dd86b62..843ccf0 100644 (file)
@@ -553,7 +553,7 @@ private:
         return 0x2A == get_endian_short(header + 2, littleEndian);
     }
 
-    void init(int width, int height, const dng_point& cfaPatternSize) {
+    bool init(int width, int height, const dng_point& cfaPatternSize) {
         fWidth = width;
         fHeight = height;
 
@@ -561,6 +561,8 @@ private:
         // a mosaic info is available.
         fIsScalable = cfaPatternSize.v != 0 && cfaPatternSize.h != 0;
         fIsXtransImage = fIsScalable ? (cfaPatternSize.v == 6 && cfaPatternSize.h == 6) : false;
+
+        return width > 0 && height > 0;
     }
 
     bool initFromPiex() {
@@ -570,15 +572,9 @@ private:
         if (::piex::IsRaw(&piexStream)
             && ::piex::GetPreviewImageData(&piexStream, &imageData) == ::piex::Error::kOk)
         {
-            // Verify the size information, as it is only optional information for PIEX.
-            if (imageData.full_width == 0 || imageData.full_height == 0) {
-                return false;
-            }
-
             dng_point cfaPatternSize(imageData.cfa_pattern_dim[1], imageData.cfa_pattern_dim[0]);
-            this->init(static_cast<int>(imageData.full_width),
-                       static_cast<int>(imageData.full_height), cfaPatternSize);
-            return true;
+            return this->init(static_cast<int>(imageData.full_width),
+                              static_cast<int>(imageData.full_height), cfaPatternSize);
         }
         return false;
     }
@@ -606,10 +602,9 @@ private:
             if (fNegative->GetMosaicInfo() != nullptr) {
                 cfaPatternSize = fNegative->GetMosaicInfo()->fCFAPatternSize;
             }
-            this->init(static_cast<int>(fNegative->DefaultCropSizeH().As_real64()),
-                       static_cast<int>(fNegative->DefaultCropSizeV().As_real64()),
-                       cfaPatternSize);
-            return true;
+            return this->init(static_cast<int>(fNegative->DefaultCropSizeH().As_real64()),
+                              static_cast<int>(fNegative->DefaultCropSizeV().As_real64()),
+                              cfaPatternSize);
         } catch (...) {
             return false;
         }
index d15c710..dd96996 100644 (file)
@@ -648,6 +648,9 @@ DEF_TEST(Codec_Empty, r) {
     test_invalid(r, "empty_images/zero-height.wbmp");
     // This image is an ico with an embedded mask-bmp.  This is illegal.
     test_invalid(r, "invalid_images/mask-bmp-ico.ico");
+#if defined(SK_CODEC_DECODES_RAW) && (!defined(_WIN32))
+    test_invalid(r, "empty_images/zero_height.tiff");
+#endif
 }
 
 static void test_invalid_parameters(skiatest::Reporter* r, const char path[]) {