From c34f78dd37c2a2015d43de5d89748a2f8147ba1b Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 Jan 2012 23:14:57 +0000 Subject: Tue Jan 31 23:14:56 UTC 2012 --- .../xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 testing/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch (limited to 'testing/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch') diff --git a/testing/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch b/testing/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch new file mode 100644 index 000000000..dc93a2e8a --- /dev/null +++ b/testing/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch @@ -0,0 +1,81 @@ +# HG changeset patch +# User Glenn Randers-Pehrson +# Date 1320490106 0 +# Node ID aff1bd412058cb6926a8feae1e8c0fc76b4c04a3 +# Parent 8248dbffd64534fb6c65ad3d757b795119e783c6 +Bug 682677 - Eliminated direct access to mInfo->pixel_depth, which is not allowed in libpng15. We access pixel_depth via png_get_IHDR() instead; r=joedrew + +diff --git a/modules/libpr0n/decoders/nsICODecoder.cpp b/modules/libpr0n/decoders/nsICODecoder.cpp +--- a/modules/libpr0n/decoders/nsICODecoder.cpp ++++ b/modules/libpr0n/decoders/nsICODecoder.cpp +@@ -381,18 +381,17 @@ nsICODecoder::WriteInternal(const char* + return; + } + mPos += aCount; + aBuffer += aCount; + aCount = 0; + + // Raymond Chen says that 32bpp only are valid PNG ICOs + // http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx +- if (static_cast(mContainedDecoder.get())->HasValidInfo() && +- static_cast(mContainedDecoder.get())->GetPixelDepth() != 32) { ++ if (!static_cast(mContainedDecoder.get())->IsValidICO()) { + PostDataError(); + } + return; + } + + // We've processed all of the icon dir entries and are within the + // bitmap info size + if (!mIsPNG && mCurrIcon == mNumIcons && mPos >= mImageOffset && +diff --git a/modules/libpr0n/decoders/nsPNGDecoder.h b/modules/libpr0n/decoders/nsPNGDecoder.h +--- a/modules/libpr0n/decoders/nsPNGDecoder.h ++++ b/modules/libpr0n/decoders/nsPNGDecoder.h +@@ -68,29 +68,35 @@ public: + + void CreateFrame(png_uint_32 x_offset, png_uint_32 y_offset, + PRInt32 width, PRInt32 height, + gfxASurface::gfxImageFormat format); + void SetAnimFrameInfo(); + + void EndImageFrame(); + +- // Checks if the info header contains valid information +- bool HasValidInfo() const ++ // Check if PNG is valid ICO (32bpp RGBA) ++ // http://blogs.msdn.com/b/oldnewthing/archive/2010/10/22/10079192.aspx ++ bool IsValidICO() const + { +- return mInfo && mInfo->valid; +- } ++ png_uint_32 ++ png_width, // Unused ++ png_height; // Unused + +- // Obtain the pixel depth if available or 0 otherwise +- PRInt32 GetPixelDepth() const +- { +- if (!mInfo) { +- return 0; ++ int png_bit_depth, ++ png_color_type; ++ ++ if (png_get_IHDR(mPNG, mInfo, &png_width, &png_height, &png_bit_depth, ++ &png_color_type, NULL, NULL, NULL)) { ++ ++ return (png_color_type == PNG_COLOR_TYPE_RGB_ALPHA && ++ png_bit_depth == 8); ++ } else { ++ return false; + } +- return mInfo->pixel_depth; + } + + public: + png_structp mPNG; + png_infop mInfo; + nsIntRect mFrameRect; + PRUint8 *mCMSLine; + PRUint8 *interlacebuf; + + -- cgit v1.2.3-54-g00ecf