summaryrefslogtreecommitdiff
path: root/staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-01-30 23:15:09 +0000
committerroot <root@rshg054.dnsready.net>2012-01-30 23:15:09 +0000
commit902eddd7e029eda6fc1c668b31e696c6ca3edbc7 (patch)
tree7daed2a9811a9c58333dafddaa471222520022b0 /staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch
parent39711f3264d3b9de2ff6392649274d6333932457 (diff)
Mon Jan 30 23:15:08 UTC 2012
Diffstat (limited to 'staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch')
-rw-r--r--staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch b/staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch
new file mode 100644
index 000000000..dc93a2e8a
--- /dev/null
+++ b/staging/xulrunner/5007_fix_libpr0n_nsPNGDecoder.patch
@@ -0,0 +1,81 @@
+# HG changeset patch
+# User Glenn Randers-Pehrson <glennrp+bmo@gmail.com>
+# 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<nsPNGDecoder*>(mContainedDecoder.get())->HasValidInfo() &&
+- static_cast<nsPNGDecoder*>(mContainedDecoder.get())->GetPixelDepth() != 32) {
++ if (!static_cast<nsPNGDecoder*>(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;
+
+